<?php

namespace App\Filament\Resources\Credits\Actions;

use App\Filament\Resources\Credits\CreditResource;
use App\Models\Credit;
use App\Services\CreditOperationService;
use Filament\Actions\Action;
use Filament\Forms;
use Filament\Notifications\Notification;

class CloneCreditAction
{
    public static function make(): Action
    {
        return Action::make('clone_credit')
            ->label('Nuevo Crédito (Editable)')
            ->icon('heroicon-o-plus-circle')
            ->color('primary')
            ->modalHeading('Crear nuevo crédito a partir del actual')
            ->modalDescription('Se creará un nuevo crédito editable basado en el saldo y condiciones seleccionadas.')
            ->modalSubmitActionLabel('Crear nuevo crédito')
            ->visible(fn (?Credit $record): bool => filled($record) && ! $record->isClosed()
            )
            ->schema([
                Forms\Components\TextInput::make('amount')
                    ->numeric()
                    ->minValue(0.01)
                    ->label('Monto del nuevo crédito')
                    ->required(),

                Forms\Components\TextInput::make('interest_rate')
                    ->numeric()
                    ->minValue(0.01)
                    ->label('Tasa de interés (%)')
                    ->suffix('%')
                    ->required(),

                Forms\Components\TextInput::make('new_installments')
                    ->numeric()
                    ->minValue(1)
                    ->label('Número de cuotas')
                    ->required(),

                Forms\Components\Select::make('periodicity')
                    ->label('Periodicidad del pago')
                    ->options([
                        'daily' => 'Diario',
                        'weekly' => 'Semanal',
                        'biweekly' => 'Quincenal',
                        'monthly' => 'Mensual',
                    ])
                    ->required(),
            ])
            ->action(function (array $data, Credit $credit) {
                try {
                    /** @var CreditOperationService $service */
                    $service = app(CreditOperationService::class);

                    $new = $service->executeOperation($credit, [
                        'operation_type' => 'clone',
                        'new_installments' => (int) $data['new_installments'],
                        'amount' => (float) $data['amount'],
                        'interest_rate' => (float) $data['interest_rate'],
                        'periodicity' => $data['periodicity'],
                    ]);

                    Notification::make()
                        ->title("Crédito creado (#{$new->code})")
                        ->success()
                        ->body('Se ha creado un nuevo crédito editable basado en el crédito actual.')
                        ->send();

                    return redirect()->to(
                        CreditResource::getUrl('edit', ['record' => $new])
                    );
                } catch (\Throwable $e) {
                    Notification::make()
                        ->title('No se pudo crear el nuevo crédito')
                        ->danger()
                        ->body($e->getMessage())
                        ->send();
                }
            });
    }
}
