import { Head, router } from '@inertiajs/react';
import {
    ArrowDownIcon,
    ArrowUpIcon,
    Award,
    BarChart3,
    CircleDollarSign,
    UserPlus,
    Users,
} from 'lucide-react';
import { useMemo, useState } from 'react';

import {
    Card,
    CardAction,
    CardContent,
    CardHeader,
    CardTitle,
} from '@/components/ui/card';
import {
    Select,
    SelectContent,
    SelectItem,
    SelectTrigger,
    SelectValue,
} from '@/components/ui/select';
import AppLayout from '@/layouts/app-layout';
import { formatIDR } from '@/lib/formatters';
import dailyCollectionRoutes from '@/routes/daily-collection';
import type { BreadcrumbItem } from '@/types';
import type {
    CollectorPerformance,
    PerformanceData,
} from '@/types/daily-collection';

import { Skeleton } from '@/components/ui/skeleton';

interface PageProps {
    performanceData?: PerformanceData;
    filters: {
        year: number;
        month: number;
    };
}

const MONTH_NAMES = [
    'Januari',
    'Februari',
    'Maret',
    'April',
    'Mei',
    'Juni',
    'Juli',
    'Agustus',
    'September',
    'Oktober',
    'November',
    'Desember',
];

const breadcrumbs: BreadcrumbItem[] = [
    {
        title: 'Penagihan Harian',
        href: dailyCollectionRoutes.index().url,
    },
    {
        title: 'Laporan Performa Staff',
        href: dailyCollectionRoutes.performance().url,
    },
];

type SortKey = keyof CollectorPerformance;

export default function Performance({ performanceData, filters }: PageProps) {
    const summary = performanceData?.summary;
    const collectors = performanceData?.collectors ?? [];
    const [sortKey, setSortKey] = useState<SortKey>('members_recruited');
    const [sortDir, setSortDir] = useState<'asc' | 'desc'>('desc');

    const handleFilterChange = (year: number, month: number) => {
        router.get(
            dailyCollectionRoutes.performance().url,
            { year, month },
            { preserveState: true, preserveScroll: true },
        );
    };

    const currentYear = new Date().getFullYear();
    const years = Array.from({ length: 5 }, (_, i) => currentYear - i);

    const sortedCollectors = useMemo(() => {
        return [...collectors].sort((a, b) => {
            const aVal = a[sortKey];
            const bVal = b[sortKey];
            if (typeof aVal === 'number' && typeof bVal === 'number') {
                return sortDir === 'desc' ? bVal - aVal : aVal - bVal;
            }
            return 0;
        });
    }, [collectors, sortKey, sortDir]);

    const handleSort = (key: SortKey) => {
        if (sortKey === key) {
            setSortDir((prev) => (prev === 'desc' ? 'asc' : 'desc'));
        } else {
            setSortKey(key);
            setSortDir('desc');
        }
    };

    return (
        <AppLayout breadcrumbs={breadcrumbs}>
            <Head title="Laporan Performa Staff" />

            <div className="flex h-full flex-1 flex-col gap-4 overflow-x-auto rounded-xl p-4">
                {/* Header */}
                <div className="flex flex-col gap-4 md:flex-row md:items-center md:justify-between">
                    <div className="flex flex-col gap-1">
                        <h1 className="text-2xl font-black">
                            Laporan Performa Staff
                        </h1>
                        <span className="text-sm text-muted-foreground">
                            Performa bulanan seluruh staff — rekrutmen anggota
                            baru sebagai KPI utama.
                        </span>
                    </div>
                    <div className="flex items-center gap-2">
                        <Select
                            value={String(filters.month)}
                            onValueChange={(val) =>
                                handleFilterChange(
                                    filters.year,
                                    parseInt(val, 10),
                                )
                            }
                        >
                            <SelectTrigger className="w-36" id="month-select">
                                <SelectValue placeholder="Bulan" />
                            </SelectTrigger>
                            <SelectContent>
                                {MONTH_NAMES.map((name, i) => (
                                    <SelectItem
                                        key={i + 1}
                                        value={String(i + 1)}
                                    >
                                        {name}
                                    </SelectItem>
                                ))}
                            </SelectContent>
                        </Select>
                        <Select
                            value={String(filters.year)}
                            onValueChange={(val) =>
                                handleFilterChange(
                                    parseInt(val, 10),
                                    filters.month,
                                )
                            }
                        >
                            <SelectTrigger className="w-24" id="year-select">
                                <SelectValue placeholder="Tahun" />
                            </SelectTrigger>
                            <SelectContent>
                                {years.map((year) => (
                                    <SelectItem key={year} value={String(year)}>
                                        {year}
                                    </SelectItem>
                                ))}
                            </SelectContent>
                        </Select>
                    </div>
                </div>

                {/* Summary Cards */}
                <div className="grid gap-4 md:grid-cols-4">
                    {[
                        {
                            title: 'Anggota Baru',
                            icon: UserPlus,
                            value: summary?.total_members_recruited,
                            desc: 'Total direkrut bulan ini',
                            primary: true,
                        },
                        {
                            title: 'Pengajuan Pembiayaan',
                            icon: BarChart3,
                            value: summary?.total_financing_proposals,
                            desc: 'Diajukan bulan ini',
                        },
                        {
                            title: 'Total Penagihan',
                            icon: CircleDollarSign,
                            value: summary
                                ? formatIDR(summary.total_collected)
                                : undefined,
                            desc: summary
                                ? `Rata-rata sukses: ${summary.average_success_rate}%`
                                : 'Memuat...',
                        },
                        {
                            title: 'Top Recruiter',
                            icon: Award,
                            value: summary?.top_recruiter,
                            desc: 'Perekrut anggota terbanyak',
                            special: true,
                        },
                    ].map((card, i) => (
                        <Card
                            key={i}
                            className={
                                card.special
                                    ? 'border-amber-200 bg-amber-50/50 dark:border-amber-800/50 dark:bg-amber-950/20'
                                    : ''
                            }
                        >
                            <CardHeader>
                                <CardTitle>{card.title}</CardTitle>
                                <CardAction>
                                    <card.icon
                                        className={`h-4 w-4 ${card.primary ? 'text-primary' : card.special ? 'text-amber-500' : ''}`}
                                    />
                                </CardAction>
                            </CardHeader>
                            <CardContent>
                                {summary ? (
                                    <div
                                        className={`text-2xl font-bold ${card.primary ? 'text-primary' : card.special ? 'text-xl text-amber-700 dark:text-amber-400' : ''}`}
                                    >
                                        {card.value}
                                    </div>
                                ) : (
                                    <Skeleton className="h-8 w-1/2" />
                                )}
                                <p className="text-xs text-muted-foreground">
                                    {card.desc}
                                </p>
                            </CardContent>
                        </Card>
                    ))}
                </div>

                {/* Performance Table */}
                {!performanceData ? (
                    <div className="overflow-hidden rounded-xl border bg-card">
                        <div className="p-1">
                            <Skeleton className="mb-1 h-10 w-full" />
                            {[...Array(5)].map((_, i) => (
                                <Skeleton
                                    key={i}
                                    className="mb-1 h-12 w-full"
                                />
                            ))}
                        </div>
                    </div>
                ) : collectors.length === 0 ? (
                    <div className="flex flex-col items-center justify-center rounded-xl border border-dashed bg-muted/50 p-12 text-center">
                        <div className="rounded-full bg-primary/10 p-4">
                            <Users className="h-8 w-8 text-primary" />
                        </div>
                        <h3 className="mt-4 text-lg font-semibold">
                            Tidak Ada Data
                        </h3>
                        <p className="mt-2 text-sm text-muted-foreground">
                            Belum ada data performa collector untuk periode ini.
                        </p>
                    </div>
                ) : (
                    <div className="overflow-hidden rounded-xl border bg-card">
                        <div className="overflow-x-auto">
                            <table className="w-full">
                                <thead>
                                    <tr className="border-b bg-muted/50">
                                        <th className="px-4 py-3 text-left text-xs font-semibold">
                                            #
                                        </th>
                                        <th className="px-4 py-3 text-left text-xs font-semibold">
                                            Collector
                                        </th>
                                        <SortableHeader
                                            label="🏆 Anggota Baru"
                                            columnKey="members_recruited"
                                            sortKey={sortKey}
                                            sortDir={sortDir}
                                            onSort={handleSort}
                                            isPrimary
                                        />
                                        <SortableHeader
                                            label="Pembiayaan"
                                            columnKey="financing_proposals"
                                            sortKey={sortKey}
                                            sortDir={sortDir}
                                            onSort={handleSort}
                                        />
                                        <SortableHeader
                                            label="Tugas"
                                            columnKey="tasks_assigned"
                                            sortKey={sortKey}
                                            sortDir={sortDir}
                                            onSort={handleSort}
                                        />
                                        <SortableHeader
                                            label="Selesai"
                                            columnKey="tasks_completed"
                                            sortKey={sortKey}
                                            sortDir={sortDir}
                                            onSort={handleSort}
                                        />
                                        <SortableHeader
                                            label="Sukses %"
                                            columnKey="success_rate"
                                            sortKey={sortKey}
                                            sortDir={sortDir}
                                            onSort={handleSort}
                                        />
                                        <SortableHeader
                                            label="Penagihan"
                                            columnKey="amount_collected"
                                            sortKey={sortKey}
                                            sortDir={sortDir}
                                            onSort={handleSort}
                                        />
                                        <SortableHeader
                                            label="Capaian %"
                                            columnKey="achievement_rate"
                                            sortKey={sortKey}
                                            sortDir={sortDir}
                                            onSort={handleSort}
                                        />
                                        <SortableHeader
                                            label="Tunggakan"
                                            columnKey="overdue_count"
                                            sortKey={sortKey}
                                            sortDir={sortDir}
                                            onSort={handleSort}
                                        />
                                    </tr>
                                </thead>
                                <tbody>
                                    {sortedCollectors.map(
                                        (collector, index) => (
                                            <PerformanceRow
                                                key={collector.collector_id}
                                                collector={collector}
                                                rank={index + 1}
                                            />
                                        ),
                                    )}
                                </tbody>
                            </table>
                        </div>
                    </div>
                )}
            </div>
        </AppLayout>
    );
}

function SortableHeader({
    label,
    columnKey,
    sortKey,
    sortDir,
    onSort,
    isPrimary = false,
}: {
    label: string;
    columnKey: SortKey;
    sortKey: SortKey;
    sortDir: 'asc' | 'desc';
    onSort: (key: SortKey) => void;
    isPrimary?: boolean;
}) {
    const isActive = sortKey === columnKey;

    return (
        <th
            className={`cursor-pointer px-4 py-3 text-center text-xs font-semibold transition-colors select-none hover:bg-muted/80 ${
                isPrimary ? 'bg-primary/5 text-primary dark:bg-primary/10' : ''
            }`}
            onClick={() => onSort(columnKey)}
        >
            {label}{' '}
            {isActive &&
                (sortDir === 'desc' ? (
                    <ArrowDownIcon className="inline h-3 w-3" />
                ) : (
                    <ArrowUpIcon className="inline h-3 w-3" />
                ))}
        </th>
    );
}

function PerformanceRow({
    collector,
    rank,
}: {
    collector: CollectorPerformance;
    rank: number;
}) {
    const successColor =
        collector.success_rate >= 80
            ? 'text-emerald-600 dark:text-emerald-400'
            : collector.success_rate >= 50
              ? 'text-amber-600 dark:text-amber-400'
              : 'text-red-600 dark:text-red-400';

    const achievementColor =
        collector.achievement_rate >= 80
            ? 'text-emerald-600 dark:text-emerald-400'
            : collector.achievement_rate >= 50
              ? 'text-amber-600 dark:text-amber-400'
              : 'text-red-600 dark:text-red-400';

    return (
        <tr className="border-b transition-colors last:border-0 hover:bg-muted/30">
            <td className="px-4 py-3 text-center">
                {rank <= 3 ? (
                    <span
                        className={`inline-flex h-6 w-6 items-center justify-center rounded-full text-xs font-bold text-white ${
                            rank === 1
                                ? 'bg-amber-500'
                                : rank === 2
                                  ? 'bg-slate-400'
                                  : 'bg-amber-700'
                        }`}
                    >
                        {rank}
                    </span>
                ) : (
                    <span className="text-sm text-muted-foreground">
                        {rank}
                    </span>
                )}
            </td>
            <td className="px-4 py-3">
                <div className="flex items-center gap-2">
                    <div className="flex h-8 w-8 items-center justify-center rounded-full bg-primary/10 text-xs font-bold text-primary">
                        {collector.collector_name.charAt(0).toUpperCase()}
                    </div>
                    <span className="text-sm font-medium">
                        {collector.collector_name}
                    </span>
                </div>
            </td>
            <td className="bg-primary/5 px-4 py-3 text-center dark:bg-primary/10">
                <span className="text-lg font-bold text-primary">
                    {collector.members_recruited}
                </span>
            </td>
            <td className="px-4 py-3 text-center text-sm">
                {collector.financing_proposals}
            </td>
            <td className="px-4 py-3 text-center text-sm">
                {collector.tasks_assigned}
            </td>
            <td className="px-4 py-3 text-center text-sm">
                {collector.tasks_completed}
            </td>
            <td
                className={`px-4 py-3 text-center text-sm font-bold ${successColor}`}
            >
                {collector.success_rate}%
            </td>
            <td className="px-4 py-3 text-right text-sm font-medium">
                {formatIDR(collector.amount_collected)}
            </td>
            <td
                className={`px-4 py-3 text-center text-sm font-bold ${achievementColor}`}
            >
                {collector.achievement_rate}%
            </td>
            <td className="px-4 py-3 text-center text-sm">
                {collector.overdue_count > 0 ? (
                    <span className="rounded-full bg-red-100 px-2 py-0.5 text-xs font-medium text-red-700 dark:bg-red-900/30 dark:text-red-400">
                        {collector.overdue_count}
                    </span>
                ) : (
                    <span className="text-muted-foreground">0</span>
                )}
            </td>
        </tr>
    );
}
