import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table';
import { useTranslation } from '@/hooks/use-translation';
import AppLayout from '@/layouts/app-layout';
import { BreadcrumbItem, WhatsAppSendStatus, WhatsAppTemplateSend } from '@/types';
import { Head, Link, usePage } from '@inertiajs/react';
import { ArrowLeft, Search } from 'lucide-react';
import { useMemo, useState } from 'react';

interface StatsTemplate {
    id: number;
    friendly_name: string;
    body: string;
    template_type: string;
    approval_status: string;
}

interface Counts {
    total: number;
    unique: number;
    sent: number;
    delivered: number;
    read: number;
    failed: number;
    responded: number;
    yes: number;
    no: number;
    pending: number;
}

interface PageProps {
    template: StatsTemplate;
    counts: Counts;
    sends: WhatsAppTemplateSend[];
    [key: string]: unknown;
}

const statusConfig: Record<WhatsAppSendStatus, string> = {
    queued: 'bg-gray-200 text-gray-700',
    sent: 'bg-blue-100 text-blue-800',
    delivered: 'bg-indigo-100 text-indigo-800',
    read: 'bg-green-100 text-green-800',
    failed: 'bg-red-100 text-red-800',
};

const formatDate = (value: string | null) =>
    value ? new Date(value).toLocaleString('fr-FR', { dateStyle: 'short', timeStyle: 'short' }) : '—';

// Percentage of n over d as a compact label; "—" when there's nothing to divide by.
const pct = (n: number, d: number) => (d > 0 ? `${Math.round((n / d) * 100)}%` : '—');

type StatusFilter = 'all' | 'sent' | 'delivered' | 'read' | 'failed' | 'responded' | 'yes' | 'no' | 'pending';

export default function WhatsAppTemplateStats() {
    const { t } = useTranslation();
    const { template, counts, sends } = usePage<PageProps>().props;

    const [search, setSearch] = useState('');
    const [status, setStatus] = useState<StatusFilter>('all');

    const filtered = useMemo(() => {
        const q = search.trim().toLowerCase();
        return sends.filter((s) => {
            const matchesText =
                q === '' ||
                (s.name ?? '').toLowerCase().includes(q) ||
                s.phone.toLowerCase().includes(q) ||
                (s.response_text ?? '').toLowerCase().includes(q);
            const matchesStatus =
                status === 'all'
                    ? true
                    : status === 'responded'
                      ? s.responded_at !== null
                      : status === 'yes'
                        ? s.reply_choice === 'yes'
                        : status === 'no'
                          ? s.reply_choice === 'no'
                          : status === 'pending'
                            ? s.responded_at === null && s.status !== 'failed'
                            : s.status === status;
            return matchesText && matchesStatus;
        });
    }, [sends, search, status]);

    const breadcrumbs: BreadcrumbItem[] = [
        { title: t('newsletters', 'whatsapp'), href: '/newsletters/whatsapp' },
        { title: template.friendly_name, href: route('newsletters.whatsapp.templates.stats', template.id) },
    ];

    const statusOptions: StatusFilter[] = ['all', 'sent', 'delivered', 'read', 'failed', 'responded', 'yes', 'pending', 'no'];

    return (
        <AppLayout breadcrumbs={breadcrumbs}>
            <Head title={template.friendly_name} />

            <div className="flex flex-col gap-6 p-6">
                <div className="flex flex-wrap items-center justify-between gap-3">
                    <div>
                        <h1 className="text-2xl font-semibold">{template.friendly_name}</h1>
                        <p className="mt-1 text-sm text-muted-foreground">{t('newsletters', 'stats')}</p>
                    </div>
                    <Button variant="outline" size="sm" asChild>
                        <Link href="/newsletters/whatsapp">
                            <ArrowLeft className="mr-1.5 h-4 w-4" />
                            {t('newsletters', 'back_to_templates')}
                        </Link>
                    </Button>
                </div>

                {/* KPI cards */}
                <div className="grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-6">
                    <StatCard
                        label={t('newsletters', 'recipient')}
                        value={counts.total}
                        sub={`${counts.unique} ${t('newsletters', 'unique_numbers')}`}
                    />
                    <StatCard label={t('newsletters', 'sent')} value={counts.sent} className="text-blue-700" />
                    <StatCard
                        label={t('newsletters', 'delivered')}
                        value={counts.delivered}
                        sub={pct(counts.delivered, counts.sent)}
                        className="text-indigo-700"
                    />
                    <StatCard
                        label={t('newsletters', 'read')}
                        value={counts.read}
                        sub={pct(counts.read, counts.sent)}
                        className="text-green-700"
                    />
                    <StatCard
                        label={t('newsletters', 'failed')}
                        value={counts.failed}
                        sub={pct(counts.failed, counts.total)}
                        className="text-red-700"
                    />
                    <StatCard
                        label={t('newsletters', 'responded')}
                        value={counts.responded}
                        sub={pct(counts.responded, counts.sent)}
                        className="text-amber-700"
                    />
                    <StatCard
                        label={t('newsletters', 'yes')}
                        value={counts.yes}
                        sub={pct(counts.yes, counts.sent)}
                        className="text-green-700"
                    />
                    <StatCard
                        label={t('newsletters', 'pending')}
                        value={counts.pending}
                        sub={pct(counts.pending, counts.sent)}
                        className="text-amber-700"
                    />
                    <StatCard
                        label={t('newsletters', 'no')}
                        value={counts.no}
                        sub={pct(counts.no, counts.sent)}
                        className="text-red-700"
                    />
                </div>

                {/* Search + status filter */}
                <div className="flex flex-wrap items-center gap-3">
                    <div className="relative max-w-sm flex-1">
                        <Search className="pointer-events-none absolute left-2.5 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" />
                        <Input
                            value={search}
                            onChange={(e) => setSearch(e.target.value)}
                            placeholder={t('newsletters', 'search_sends')}
                            className="pl-9"
                        />
                    </div>
                    <select
                        value={status}
                        onChange={(e) => setStatus(e.target.value as StatusFilter)}
                        className="h-9 rounded-md border bg-background px-3 text-sm"
                    >
                        {statusOptions.map((opt) => (
                            <option key={opt} value={opt}>
                                {opt === 'all' ? t('newsletters', 'all_statuses') : t('newsletters', opt)}
                            </option>
                        ))}
                    </select>
                </div>

                {/* Sends table */}
                <div className="rounded-md border bg-card shadow-sm">
                    <Table>
                        <TableHeader>
                            <TableRow>
                                <TableHead>{t('newsletters', 'name')}</TableHead>
                                <TableHead>{t('newsletters', 'phone')}</TableHead>
                                <TableHead>{t('newsletters', 'type')}</TableHead>
                                <TableHead>{t('newsletters', 'status')}</TableHead>
                                <TableHead>{t('newsletters', 'response')}</TableHead>
                                <TableHead>{t('newsletters', 'sent_at')}</TableHead>
                            </TableRow>
                        </TableHeader>
                        <TableBody>
                            {filtered.length === 0 ? (
                                <TableRow>
                                    <TableCell colSpan={6} className="py-8 text-center text-muted-foreground">
                                        {sends.length === 0 ? t('newsletters', 'no_sends') : t('newsletters', 'no_results')}
                                    </TableCell>
                                </TableRow>
                            ) : (
                                filtered.map((send) => (
                                    <TableRow key={send.id}>
                                        <TableCell className="font-medium">{send.name ?? '—'}</TableCell>
                                        <TableCell className="font-mono text-xs">{send.phone}</TableCell>
                                        <TableCell>
                                            {send.recipient_type ? t('newsletters', send.recipient_type) : '—'}
                                        </TableCell>
                                        <TableCell>
                                            <Badge className={statusConfig[send.status]}>
                                                {t('newsletters', send.status)}
                                            </Badge>
                                        </TableCell>
                                        <TableCell className="max-w-xs truncate">
                                            {send.reply_choice ? (
                                                <Badge
                                                    className={
                                                        send.reply_choice === 'yes'
                                                            ? 'bg-green-100 text-green-800'
                                                            : 'bg-red-100 text-red-800'
                                                    }
                                                >
                                                    {t('newsletters', send.reply_choice)}
                                                </Badge>
                                            ) : (
                                                (send.response_text ?? '—')
                                            )}
                                        </TableCell>
                                        <TableCell className="text-xs text-muted-foreground">
                                            {formatDate(send.sent_at)}
                                        </TableCell>
                                    </TableRow>
                                ))
                            )}
                        </TableBody>
                    </Table>
                </div>
            </div>
        </AppLayout>
    );
}

function StatCard({ label, value, sub, className }: { label: string; value: number; sub?: string; className?: string }) {
    return (
        <div className="rounded-md border bg-card px-4 py-3 shadow-sm">
            <div className="text-xs uppercase tracking-wide text-muted-foreground">{label}</div>
            <div className={`mt-1 text-2xl font-semibold ${className ?? ''}`}>{value}</div>
            {sub && <div className="mt-0.5 text-xs text-muted-foreground">{sub}</div>}
        </div>
    );
}
