import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { useTranslation } from '@/hooks/use-translation';
import AppLayout from '@/layouts/app-layout';
import { ClicToPayTransactionDetail, type BreadcrumbItem } from '@/types';
import { Head, Link, router, usePage } from '@inertiajs/react';
import { ArrowLeft, Copy, ExternalLink, RefreshCw, Undo2 } from 'lucide-react';
import { useEffect, useState } from 'react';
import { toast } from 'sonner';

interface PageProps {
    transaction: ClicToPayTransactionDetail;
    canRefund: boolean;
    flash?: { type: string; message: string };
    [key: string]: unknown;
}

type BadgeVariant = 'default' | 'secondary' | 'destructive' | 'outline';

function statusBadgeProps(status: string): { variant: BadgeVariant; className: string } {
    switch (status) {
        case 'paid':
            return { variant: 'default', className: 'border-transparent bg-green-600 text-white' };
        case 'declined':
        case 'failed':
        case 'init_failed':
            return { variant: 'destructive', className: '' };
        case 'refunded':
            return { variant: 'default', className: 'border-transparent bg-blue-600 text-white' };
        default:
            return { variant: 'secondary', className: 'border-transparent bg-amber-100 text-amber-800' };
    }
}

function formatDate(value: string | null): string {
    if (!value) return '—';
    const d = new Date(value);
    return Number.isNaN(d.getTime()) ? '—' : d.toLocaleString();
}

export default function Show() {
    const { t } = useTranslation();
    const { transaction: txn, canRefund, flash } = usePage<PageProps>().props;
    const [refundOpen, setRefundOpen] = useState(false);
    const [refundAmount, setRefundAmount] = useState('');
    const [refunding, setRefunding] = useState(false);

    const breadcrumbs: BreadcrumbItem[] = [
        { title: t('clictopay', 'title'), href: '/paiements/en-ligne' },
        { title: t('clictopay', 'detail_title'), href: `/paiements/en-ligne/${txn.id}` },
    ];

    useEffect(() => {
        if (flash?.type === 'success') toast.success(flash.message);
        else if (flash?.type === 'error') toast.error(flash.message);
    }, [flash]);

    const { variant, className } = statusBadgeProps(txn.status);

    const copyLink = () => {
        if (!txn.form_url) return;
        navigator.clipboard.writeText(txn.form_url);
        toast.success(t('clictopay', 'copied'));
    };

    const handleRefresh = () => {
        router.post(route('clictopay.refresh', txn.id), {}, { preserveScroll: true });
    };

    const handleRefund = () => {
        setRefunding(true);
        router.post(
            route('clictopay.refund', txn.id),
            refundAmount ? { amount: refundAmount } : {},
            {
                preserveScroll: true,
                onFinish: () => setRefunding(false),
                onSuccess: () => {
                    setRefundOpen(false);
                    setRefundAmount('');
                },
            },
        );
    };

    const detailRow = (label: string, value: React.ReactNode) => (
        <div className="flex flex-col gap-0.5">
            <span className="text-xs text-muted-foreground">{label}</span>
            <span className="text-sm font-medium break-all">{value ?? '—'}</span>
        </div>
    );

    return (
        <AppLayout breadcrumbs={breadcrumbs}>
            <Head title={`${t('clictopay', 'detail_title')} — ${txn.order_number}`} />
            <div className="mx-auto max-w-4xl space-y-4 p-3 sm:p-4">
                <Link
                    href="/paiements/en-ligne"
                    className="inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground"
                >
                    <ArrowLeft className="h-4 w-4" /> {t('clictopay', 'title')}
                </Link>

                <Card>
                    <CardHeader className="flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between">
                        <div className="flex items-center gap-3">
                            <CardTitle>{txn.amount.toFixed(3)} TND</CardTitle>
                            <Badge variant={variant} className={className}>
                                {t('clictopay', `status_${txn.status}`)}
                            </Badge>
                        </div>
                        <div className="flex flex-wrap gap-2">
                            <Button variant="outline" size="sm" className="gap-1" onClick={handleRefresh}>
                                <RefreshCw className="h-4 w-4" /> {t('clictopay', 'refresh_status')}
                            </Button>
                            {canRefund && txn.status === 'paid' && (
                                <Button variant="outline" size="sm" className="gap-1" onClick={() => setRefundOpen(true)}>
                                    <Undo2 className="h-4 w-4" /> {t('clictopay', 'refund')}
                                </Button>
                            )}
                        </div>
                    </CardHeader>
                    <CardContent className="space-y-3">
                        <div className="text-sm">
                            <span className="text-muted-foreground">{t('clictopay', 'col_order_number')}: </span>
                            <span className="font-mono">{txn.order_number}</span>
                        </div>
                        {txn.form_url && (
                            <div className="rounded-md border bg-muted/30 p-3">
                                <Label className="mb-2 block">{t('clictopay', 'payment_link')}</Label>
                                <div className="flex flex-col gap-2 sm:flex-row sm:items-center">
                                    <code className="flex-1 truncate rounded bg-background px-2 py-1 text-xs">
                                        {txn.form_url}
                                    </code>
                                    <div className="flex gap-2">
                                        <Button variant="outline" size="sm" className="gap-1" onClick={copyLink}>
                                            <Copy className="h-4 w-4" /> {t('clictopay', 'copy_link')}
                                        </Button>
                                        <Button asChild variant="outline" size="sm" className="gap-1">
                                            <a href={txn.form_url} target="_blank" rel="noopener noreferrer">
                                                <ExternalLink className="h-4 w-4" /> {t('clictopay', 'open_link')}
                                            </a>
                                        </Button>
                                    </div>
                                </div>
                            </div>
                        )}
                    </CardContent>
                </Card>

                {(txn.error_code || txn.error_message) && (
                    <Card className="border-red-300">
                        <CardHeader>
                            <CardTitle className="text-base text-red-600">{t('clictopay', 'error')}</CardTitle>
                        </CardHeader>
                        <CardContent className="text-sm text-red-600">
                            {txn.error_code && <span className="font-mono">[{txn.error_code}] </span>}
                            {txn.error_message}
                        </CardContent>
                    </Card>
                )}

                <Card>
                    <CardHeader>
                        <CardTitle className="text-base">{t('clictopay', 'created_information')}</CardTitle>
                    </CardHeader>
                    <CardContent className="grid grid-cols-2 gap-4 sm:grid-cols-3">
                        {detailRow(t('clictopay', 'gateway_order_id'), txn.order_id)}
                        {detailRow(t('clictopay', 'order_status_code'), txn.order_status_code)}
                        {detailRow(t('clictopay', 'action_code'), txn.action_code_description ?? txn.action_code)}
                        {detailRow(t('clictopay', 'approval_code'), txn.approval_code)}
                        {detailRow(t('clictopay', 'masked_pan'), txn.masked_pan)}
                        {detailRow(t('clictopay', 'cardholder'), txn.cardholder_name)}
                        {detailRow(t('clictopay', 'payer_ip'), txn.payer_ip)}
                        {detailRow(t('clictopay', 'eci'), txn.eci)}
                        {detailRow(t('clictopay', 'description'), txn.description)}
                        {detailRow(t('clictopay', 'col_created_by'), txn.created_by)}
                        {detailRow(t('clictopay', 'col_created_at'), formatDate(txn.created_at))}
                        {detailRow(t('clictopay', 'col_paid_at'), formatDate(txn.paid_at))}
                        {detailRow(t('clictopay', 'expires_at'), formatDate(txn.expires_at))}
                        {detailRow(t('clictopay', 'last_checked'), formatDate(txn.last_status_checked_at))}
                        {txn.refunded_amount != null &&
                            detailRow(t('clictopay', 'refunded_amount'), `${txn.refunded_amount.toFixed(3)} TND`)}
                        {txn.refunded_at && detailRow(t('clictopay', 'status_refunded'), formatDate(txn.refunded_at))}
                        {txn.reservation_id &&
                            detailRow(
                                t('clictopay', 'col_reservation'),
                                <Link
                                    href={route('recouvrements.show', txn.reservation_id)}
                                    className="text-blue-600 hover:underline"
                                >
                                    #{txn.reservation_id}
                                </Link>,
                            )}
                    </CardContent>
                </Card>
            </div>

            <Dialog open={refundOpen} onOpenChange={setRefundOpen}>
                <DialogContent className="sm:max-w-md">
                    <DialogHeader>
                        <DialogTitle>{t('clictopay', 'refund_dialog_title')}</DialogTitle>
                    </DialogHeader>
                    <div className="mt-2">
                        <Label htmlFor="refund-amount">{t('clictopay', 'refund_amount')}</Label>
                        <Input
                            id="refund-amount"
                            type="number"
                            min={0}
                            step="0.001"
                            value={refundAmount}
                            onChange={(e) => setRefundAmount(e.target.value)}
                        />
                        <p className="mt-1 text-xs text-muted-foreground">{t('clictopay', 'refund_full_hint')}</p>
                    </div>
                    <DialogFooter className="mt-4">
                        <Button variant="outline" onClick={() => setRefundOpen(false)} disabled={refunding}>
                            {t('clictopay', 'cancel')}
                        </Button>
                        <Button onClick={handleRefund} disabled={refunding}>
                            {t('clictopay', 'confirm_refund')}
                        </Button>
                    </DialogFooter>
                </DialogContent>
            </Dialog>
        </AppLayout>
    );
}
