<?php

declare(strict_types=1);

namespace App\Filament\Resources\Credits\Actions;

use App\Models\Credit;
use App\Services\CreditSettlementService;
use App\Support\Format;
use Filament\Actions\Action;
use Filament\Forms\Components\Placeholder;
use Filament\Forms\Components\Textarea;
use Filament\Notifications\Notification;
use Illuminate\Support\HtmlString;

/**
 * Acción de Cierre Anticipado con Condonación de Saldo.
 *
 * CUÁNDO USARLA:
 *   Cuando el negocio decide "perdonar" el saldo pendiente de un crédito
 *   para cerrarlo, ya sea como descuento por pronto pago o como decisión
 *   comercial (ej. clienta pagó $1.100.000 de $1.200.000 → se condona $100.000).
 *
 * LO QUE HACE:
 *   - Eleva amount_paid = total_amount en cada cuota pendiente.
 *   - Registra forgiven_amount por cuota (auditoría).
 *   - Crea un Expense INTEREST_WAIVER (affects_cash=false, affects_profit=true).
 *   - Crea un CreditRestructureLog tipo 'condonation'.
 *   - Cambia el estado del crédito a STATUS_PAID.
 *
 * LO QUE NO HACE:
 *   - NO sale dinero de caja.
 *   - NO crea un crédito hijo.
 *   - NO reversa pagos previos.
 *
 * VISIBILIDAD:
 *   Solo visible cuando el crédito NO está cerrado y tiene saldo pendiente > 0.
 *   Solo usuarios con rol admin o super_admin pueden ejecutarla.
 */
class SettleCreditAction extends Action
{
    public static function getDefaultName(): ?string
    {
        return 'settleCredit';
    }

    protected function setUp(): void
    {
        parent::setUp();

        $this
            ->label('Condonar Saldo y Cerrar')
            ->icon('heroicon-o-gift-top')
            ->color('purple')

            // ── Visibilidad ──────────────────────────────────────────────────
            ->visible(function (): bool {
                /** @var Credit $record */
                $record = $this->getRecord();

                return ! $record->isClosed()
                    && in_array($record->status, Credit::ACTIVE_STATUSES, true)
                    && $record->remaining_balance > 0
                    && ! $record->isParent()
                    && auth()->user()?->hasAnyRole(['admin', 'super_admin']);
            })

            // ── Formulario modal ─────────────────────────────────────────────
            ->form(function (): array {
                /** @var Credit $record */
                $record = $this->getRecord();

                $remaining = Format::money($record->remaining_balance);
                $clientName = $record->client?->name ?? 'Sin cliente';
                $creditCode = $record->code;
                $totalAmount = Format::money($record->installments()->sum('total_amount'));
                $amountPaid = Format::money($record->installments()->sum('amount_paid'));

                return [
                    Placeholder::make('resumen')
                        ->label('')
                        ->content(new HtmlString("
                            <div class='space-y-3 text-sm'>

                                <div class='rounded-lg bg-purple-50 dark:bg-purple-950 border border-purple-200 dark:border-purple-800 p-4'>
                                    <p class='font-semibold text-purple-800 dark:text-purple-200 mb-2'>
                                        Cierre Anticipado — Crédito #{$creditCode}
                                    </p>
                                    <div class='grid grid-cols-3 gap-3 text-center'>
                                        <div>
                                            <p class='text-xs text-gray-500 uppercase tracking-wider'>Total a cobrar</p>
                                            <p class='font-bold text-gray-800 dark:text-gray-200'>{$totalAmount}</p>
                                        </div>
                                        <div>
                                            <p class='text-xs text-gray-500 uppercase tracking-wider'>Ya pagado</p>
                                            <p class='font-bold text-success-600 dark:text-success-400'>{$amountPaid}</p>
                                        </div>
                                        <div>
                                            <p class='text-xs text-gray-500 uppercase tracking-wider'>A CONDONAR</p>
                                            <p class='font-bold text-purple-600 dark:text-purple-400'>{$remaining}</p>
                                        </div>
                                    </div>
                                </div>

                                <div class='rounded-lg bg-info-50 dark:bg-info-950 p-3 text-info-800 dark:text-info-200 text-xs'>
                                    <strong>ℹ️ Impacto contable:</strong>
                                    <ul class='mt-1 space-y-0.5 list-disc list-inside'>
                                        <li><strong>Caja:</strong> sin cambio — no sale dinero del negocio.</li>
                                        <li><strong>Utilidad:</strong> se reduce en {$remaining} (ingreso de interés no realizado).</li>
                                        <li><strong>Estado del crédito:</strong> pasará a <strong>Pagado</strong>.</li>
                                    </ul>
                                </div>

                                <div class='rounded-lg bg-warning-50 dark:bg-warning-950 p-3 text-warning-800 dark:text-warning-200 text-xs'>
                                    <strong>⚠️ Esta acción es irreversible.</strong>
                                    Todas las cuotas pendientes de <strong>{$clientName}</strong>
                                    quedarán marcadas como condonadas.
                                </div>

                            </div>
                        ")),

                    Textarea::make('reason')
                        ->label('Motivo de la condonación')
                        ->placeholder('Ej: Descuento por pronto pago acordado con la clienta el 15/03/2026.')
                        ->required()
                        ->minLength(10)
                        ->maxLength(500)
                        ->rows(3)
                        ->helperText('Este motivo quedará registrado en el historial del crédito.'),
                ];
            })

            // ── Modal config ─────────────────────────────────────────────────
            ->modalHeading('Condonar Saldo y Cerrar Crédito')
            ->modalIcon('heroicon-o-gift-top')
            ->modalIconColor('purple')
            ->modalSubmitActionLabel('Sí, condonar y cerrar')
            ->modalCancelActionLabel('Cancelar')
            ->modalWidth('lg')

            // ── Acción principal ─────────────────────────────────────────────
            ->action(function (array $data): void {
                /** @var Credit $record */
                $record = $this->getRecord();
                $reason = trim($data['reason']);

                try {
                    $forgiven = app(CreditSettlementService::class)->settle($record, $reason);

                    Notification::make()
                        ->title('Crédito cerrado por condonación')
                        ->success()
                        ->body(
                            "Se condonaron {$forgiven->formatWithCurrency()} del crédito #{$record->code}. "
                            .'El crédito ha sido marcado como Pagado.'
                        )
                        ->persistent()
                        ->send();

                    // Refrescar la página para que el estado sea visible
                    redirect()->to(request()->header('Referer'));

                } catch (\Throwable $e) {
                    Notification::make()
                        ->title('No se pudo aplicar la condonación')
                        ->danger()
                        ->body($e->getMessage())
                        ->send();
                }
            });
    }
}
