<?php

namespace App\Filament\Resources\Credits\Actions;

use App\Models\Credit;
use App\Services\CreditOperationService;
use App\Services\FinanceAutoLogger;
use Filament\Actions\Action;
use Filament\Forms;
use Filament\Notifications\Notification;

class CancelCreditAction
{
    public static function make(): Action
    {
        return Action::make('cancel_credit')
            ->label('Cancelar crédito')
            ->icon('heroicon-o-x-circle')
            ->color('danger')
            ->requiresConfirmation()
            ->modalHeading('Cancelar crédito')
            ->modalDescription('Esta acción marcará el crédito como cancelado y eliminará automáticamente el egreso asociado.')
            ->modalSubmitActionLabel('Cancelar crédito')
            ->visible(fn (?Credit $record): bool => filled($record)
                && ! $record->isClosed()
                && $record->status !== Credit::STATUS_CANCELED
            )
            ->schema([
                Forms\Components\Textarea::make('reason')
                    ->label('Motivo de cancelación')
                    ->required()
                    ->maxLength(500),
            ])
            ->action(function (array $data, Credit $credit): void {

                // 1) Si ya está cerrado, no hacemos nada
                if ($credit->isClosed() && $credit->status !== Credit::STATUS_ACTIVE) {
                    Notification::make()
                        ->title('El crédito ya está cerrado')
                        ->warning()
                        ->send();

                    return;
                }

                // 2) Actualizar estado
                $credit->update([
                    'status' => Credit::STATUS_CANCELED,
                ]);

                // 3) Eliminar EGRESO automáticamente
                app(FinanceAutoLogger::class)
                    ->deleteCreditExpense($credit->id, $credit->company_id);

                // 4) Auditoría unificada
                app(CreditOperationService::class)->audit(
                    creditId: $credit->id,
                    action: 'credit_canceled',
                    data: ['reason' => $data['reason'] ?? null],
                    newCreditId: null,
                );

                // 5) Notificación UX
                Notification::make()
                    ->title('Crédito cancelado')
                    ->success()
                    ->body('El crédito ha sido marcado como cancelado y el egreso ha sido eliminado.')
                    ->send();
            });
    }
}
