import { Head, Link, useForm } from '@inertiajs/react';
import { ArrowLeft, Eye, FlaskConical } from 'lucide-react';
import { useState } from 'react';
import { ConfirmActionModal } from '@/components/confirm-action-modal';
import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';
import {
    Card,
    CardContent,
    CardDescription,
    CardHeader,
    CardTitle,
} from '@/components/ui/card';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';

type RunSummary = {
    run_date: string;
    tx_count: number;
    investments_distinct: number;
    total_gain: string;
};

type AccrualPolicy = {
    frequency: string;
    day_of_month: number;
    explain_daily: string;
    explain_monthly: string;
};

type Props = {
    accrual: AccrualPolicy;
    daily_run_summary: RunSummary[];
    period_run_summary: RunSummary[];
    adjustments_enabled?: boolean;
    default_accrual_date?: string;
};

function formatRunLabel(isoDate: string): string {
    try {
        return new Intl.DateTimeFormat('es', { dateStyle: 'long' }).format(new Date(isoDate));
    } catch {
        return isoDate;
    }
}

function RunsTable({
    title,
    description,
    rows,
    emphasized,
    emptyHint,
    mode,
}: {
    title: string;
    description: string;
    rows: RunSummary[];
    emphasized: boolean;
    emptyHint: string;
    mode: 'daily' | 'period';
}) {
    return (
        <Card className={emphasized ? 'border-primary/35' : undefined}>
            <CardHeader>
                <div className="flex flex-wrap items-center gap-2">
                    <CardTitle className="text-lg">{title}</CardTitle>
                    {emphasized ? (
                        <Badge variant="secondary" className="text-xs font-normal">
                            Modo vigente
                        </Badge>
                    ) : null}
                </div>
                <CardDescription>{description}</CardDescription>
            </CardHeader>
            <CardContent>
                {rows.length === 0 ? (
                    <p className="text-muted-foreground text-sm">{emptyHint}</p>
                ) : (
                    <div className="overflow-x-auto rounded-md border">
                        <table className="w-full min-w-[720px] text-left text-sm">
                            <thead className="bg-muted/40">
                                <tr className="border-b text-muted-foreground">
                                    <th className="px-3 py-2 font-medium">Fecha de ejecución</th>
                                    <th className="px-3 py-2 font-medium tabular-nums">Movimientos</th>
                                    <th className="px-3 py-2 font-medium tabular-nums">Inversiones</th>
                                    <th className="px-3 py-2 font-medium tabular-nums">Suma ganancia (US$)</th>
                                    <th className="px-3 py-2 font-medium">
                                        <span className="sr-only">Detalle</span>
                                    </th>
                                </tr>
                            </thead>
                            <tbody className="divide-y">
                                {rows.map((row) => (
                                    <tr key={row.run_date}>
                                        <td className="px-3 py-2">{formatRunLabel(row.run_date)}</td>
                                        <td className="px-3 py-2 tabular-nums">{row.tx_count}</td>
                                        <td className="px-3 py-2 tabular-nums">{row.investments_distinct}</td>
                                        <td className="px-3 py-2 font-medium tabular-nums">{row.total_gain}</td>
                                        <td className="px-3 py-2">
                                            <Button asChild size="sm" variant="outline">
                                                <Link
                                                    href={`/admin/acreditacion-mensual/${row.run_date}?mode=${mode}`}
                                                    prefetch
                                                >
                                                    <Eye className="size-4" aria-hidden />
                                                    Ver detalle
                                                </Link>
                                            </Button>
                                        </td>
                                    </tr>
                                ))}
                            </tbody>
                        </table>
                    </div>
                )}
            </CardContent>
        </Card>
    );
}

export default function PlatformMonthlyAccrualAdmin({
    accrual,
    daily_run_summary,
    period_run_summary,
    adjustments_enabled = false,
    default_accrual_date = '',
}: Props) {
    const isDaily = accrual.frequency === 'daily';
    const frequencyLabel = isDaily ? 'Diaria' : 'Mensual (día pactado)';
    const [confirmDebugOpen, setConfirmDebugOpen] = useState(false);
    const debugForm = useForm({
        date: default_accrual_date,
    });

    function runDebugAccrual() {
        debugForm.post('/admin/acreditacion-mensual/ejecutar-prueba', {
            preserveScroll: true,
            onSuccess: () => setConfirmDebugOpen(false),
        });
    }

    return (
        <>
            <Head title="Acreditaciones" />

            <div className="mx-auto max-w-5xl space-y-6 p-4">
                <div className="flex flex-wrap items-center gap-3">
                    <Link
                        className="text-muted-foreground hover:text-foreground inline-flex items-center gap-2 text-sm"
                        href="/admin"
                    >
                        <ArrowLeft className="size-4" />
                        Panel
                    </Link>
                </div>

                <Card>
                    <CardHeader>
                        <CardTitle>Acreditación automática</CardTitle>
                        <CardDescription>
                            Política actual:{' '}
                            <strong className="text-foreground">{frequencyLabel}</strong>
                            {isDaily ? null : (
                                <>
                                    {' '}
                                    — día{' '}
                                    <strong className="text-foreground tabular-nums">{accrual.day_of_month}</strong> de cada
                                    mes (en meses más cortos se usa el último día disponible).
                                </>
                            )}
                            . Las ganancias se calculan sobre el <strong className="text-foreground">
                                principal pactado
                            </strong>
                            según la tasa mensual del snapshot, prorrateada por días naturales cuando el modo es diario
                            o acumulada por períodos cuando es mensual.
                        </CardDescription>
                    </CardHeader>
                    <CardContent className="text-muted-foreground space-y-3 text-sm">
                        <p className="rounded-lg border border-amber-500/30 bg-amber-500/10 px-3 py-2 text-sm text-amber-950 dark:text-amber-100">
                            <span className="font-medium text-foreground">Confirmación por correo:</span> el planificador
                            envía cada día a los administradores un enlace para confirmar y ejecutar la acreditación en
                            el libro. Sin esa confirmación no se registran ganancias automáticas.
                        </p>
                        <p>
                            <span className="font-medium text-foreground">Diaria:</span> {accrual.explain_daily}
                        </p>
                        <p>
                            <span className="font-medium text-foreground">Por período (mensual):</span>{' '}
                            {accrual.explain_monthly}
                        </p>
                        <p>
                            El <strong className="text-foreground">capital principal pactado</strong> permanece
                            bloqueado en la inversión hasta la fecha de vencimiento; solo las ganancias disponibles por
                            contrato pueden retirarse según política (el saldo consolidado también incluye referidos).
                        </p>
                    </CardContent>
                </Card>

                {adjustments_enabled ? (
                    <Card className="border-dashed border-amber-500/50 bg-amber-500/5">
                        <CardHeader>
                            <div className="flex flex-wrap items-center gap-2">
                                <FlaskConical className="text-amber-600 size-5 dark:text-amber-400" aria-hidden />
                                <CardTitle className="text-lg">Acreditación manual</CardTitle>
                                <Badge variant="outline" className="border-amber-500/40 text-xs">
                                    ALLOW_ADJUSTMENTS
                                </Badge>
                            </div>
                            <CardDescription>
                                Ejecuta la misma lógica que el comando programado y el enlace de correo, sin
                                confirmación por email. Solo visible con ajustes administrativos habilitados.
                            </CardDescription>
                        </CardHeader>
                        <CardContent className="flex flex-col gap-4 sm:flex-row sm:flex-wrap sm:items-end">
                            <div className="grid max-w-xs gap-2">
                                <Label htmlFor="debug-accrual-date">Fecha de acreditación</Label>
                                <Input
                                    id="debug-accrual-date"
                                    type="date"
                                    value={debugForm.data.date}
                                    onChange={(e) => debugForm.setData('date', e.target.value)}
                                />
                                <p className="text-muted-foreground text-xs">
                                    {isDaily
                                        ? 'Modo diario: acredita ese día calendario por inversión activa.'
                                        : 'Modo mensual: solo acredita si la fecha coincide con el día pactado del mes.'}
                                </p>
                            </div>
                            <Button
                                type="button"
                                variant="secondary"
                                className="border-amber-500/40"
                                onClick={() => setConfirmDebugOpen(true)}
                            >
                                Ejecutar acreditación
                            </Button>
                        </CardContent>
                    </Card>
                ) : null}

                <ConfirmActionModal
                    open={confirmDebugOpen}
                    onOpenChange={setConfirmDebugOpen}
                    title="¿Ejecutar acreditación de prueba?"
                    description="Se registrarán ganancias en el libro según la política vigente (diaria o mensual). Esta acción no se puede deshacer automáticamente."
                    confirmLabel="Sí, ejecutar"
                    onConfirm={runDebugAccrual}
                    processing={debugForm.processing}
                >
                    <p className="text-sm">
                        <span className="font-medium text-foreground">Fecha:</span>{' '}
                        <span className="tabular-nums">{debugForm.data.date || '—'}</span>
                    </p>
                </ConfirmActionModal>

                <RunsTable
                    title="Ejecuciones por acreditación diaria"
                    description="Agrupado por día en que corrió el comando y se registraron filas tipo «daily_gain» sobre el libro de inversiones."
                    emphasized={isDaily}
                    rows={daily_run_summary}
                    emptyHint="No hay registros de acreditación diaria automática."
                    mode="daily"
                />

                <RunsTable
                    title="Ejecuciones por período (bloque mensual)"
                    description="Agrupado por fecha registral («accrual_on») de las filas «period_accrual», una vez por período e inversión el día pactado."
                    emphasized={!isDaily}
                    rows={period_run_summary}
                    emptyHint="No hay registros de acreditación por período automática."
                    mode="period"
                />
            </div>
        </>
    );
}

PlatformMonthlyAccrualAdmin.layout = {
    breadcrumbs: [
        { title: 'Administración', href: '/admin' },
        { title: 'Acreditaciones', href: '/admin/acreditacion-mensual' },
    ],
};
