<?php

namespace App\Filament\Resources\Credits\Pages;

use App\Filament\Concerns\EnforcesPlanLimits;
use App\Filament\Resources\Credits\CreditResource;
use App\Models\Client;
use App\Services\CreditOperationService;
use App\Services\PlanLimitService;
use Filament\Resources\Pages\CreateRecord;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;

class CreateCredit extends CreateRecord
{
    use EnforcesPlanLimits;

    protected static string $resource = CreditResource::class;

    public ?Client $selectedClient = null;

    // create + saveRelationships en una transacción → el lock de lockPlanForUpdate()
    // serializa creaciones concurrentes de la misma empresa (#169).
    protected ?bool $hasDatabaseTransactions = true;

    protected function beforeCreate(): void
    {
        $company = $this->planLimitCompany();

        if ($company) {
            $amount = (float) ($this->data['amount'] ?? 0);
            $this->lockPlanForUpdate($company);
            $this->guardPlanLimit(fn () => app(PlanLimitService::class)->assertCanCreateCredit($company, $amount));
        }
    }

    public function mount(): void
    {
        parent::mount();

        $clientId = request()->query('client_id')
            ?? $this->data['client_id']
            ?? null;

        if (! $clientId) {
            return;
        }

        $user = Auth::user();
        $query = Client::query()->where('id', $clientId);

        if (! $user->isSuperAdmin()) {
            $query->where('company_id', $user->company_id);
        }

        $this->selectedClient = $query->first();

        if ($this->selectedClient) {
            $this->data['client_id'] = $this->selectedClient->id;
            $this->data['company_id'] = $this->selectedClient->company_id;
        }
    }

    protected function handleRecordCreation(array $data): Model
    {
        return app(CreditOperationService::class)->createNewCredit($data);
    }

    protected function getRedirectUrl(): string
    {
        return $this->getResource()::getUrl('view', ['record' => $this->record]);
    }
}
