<?php

namespace App\Filament\Resources\Clients\Pages;

use App\Filament\Concerns\EnforcesPlanLimits;
use App\Filament\Resources\Clients\ClientResource;
use App\Filament\Resources\Credits\CreditResource;
use App\Services\PlanLimitService;
use Filament\Actions\Action;
use Filament\Notifications\Notification;
use Filament\Resources\Pages\CreateRecord;

class CreateClient extends CreateRecord
{
    use EnforcesPlanLimits;

    protected static string $resource = ClientResource::class;

    // Envuelve create + saveRelationships en una transacción para que el lock de
    // lockPlanForUpdate() serialice las creaciones concurrentes de la empresa (#169).
    protected ?bool $hasDatabaseTransactions = true;

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

        if ($company) {
            $this->lockPlanForUpdate($company);
            $this->guardPlanLimit(fn () => app(PlanLimitService::class)->assertCanAddClient($company));
        }
    }

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

    protected function afterCreate(): void
    {
        Notification::make()
            ->title('Cliente creado exitosamente')
            ->success()
            ->body("¿Deseas crear un crédito para {$this->record->name}?")
            ->actions([
                Action::make('createCredit')
                    ->label('Crear Crédito')
                    ->button()
                    ->url(
                        CreditResource::getUrl('create', [
                            'client_id' => $this->record->id,
                        ])
                    ),

                Action::make('later')
                    ->label('Más tarde')
                    ->button()
                    ->close(),
            ])
            ->persistent()
            ->send();
    }
}
