import { Head, Link } from "@inertiajs/react";
import { useEffect, useState } from "react";
import {
    Activity,
    CreditCard,
    DollarSign,
    Gauge,
    RefreshCw,
    Users,
    WalletCards,
    XCircle,
} from "lucide-react";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import {
    Table,
    TableBody,
    TableCell,
    TableHead,
    TableHeader,
    TableRow,
} from "@/components/ui/table";

import { useI18n } from "@/lib/i18n";
type Payment = {
    id: number;
    reference: string;
    status: string;
    amount: string | number;
    currency: string;
    created_at: string;
    user?: { id: number; name: string; email: string } | null;
    plan?: string | null;
    gateway?: string | null;
};

type Overview = {
    stats: {
        customers: number;
        active_subscriptions: number;
        pending_payments: number;
        paid_today: number;
        revenue_today: number;
        failed_payments: number;
    };
    configuration: {
        active_plans: number;
        active_gateways: number;
        active_market_providers: number;
        active_integrations: number;
    };
    recent_payments: Payment[];
};

const money = (value: number, currency = "USD") =>
    new Intl.NumberFormat("en-US", {
        style: "currency",
        currency,
        maximumFractionDigits: 2,
    }).format(Number(value));

const date = (value: string) =>
    new Intl.DateTimeFormat("en-US", {
        dateStyle: "medium",
        timeStyle: "short",
    }).format(new Date(value));

const statusVariant = (status: string) =>
    status === "paid"
        ? "default"
        : status === "failed"
          ? "destructive"
          : "outline";

export default function AdminDashboard() {
    const { t } = useI18n();
    const [data, setData] = useState<Overview | null>(null);
    const [loading, setLoading] = useState(true);
    const [error, setError] = useState("");

    const load = async () => {
        setLoading(true);
        setError("");
        try {
            const response = await fetch("/admin/overview/data", {
                headers: { Accept: "application/json" },
            });
            if (!response.ok) throw new Error("Unable to load admin overview.");
            setData(await response.json());
        } catch (err) {
            setError(
                err instanceof Error ? err.message : "Unable to load overview.",
            );
        } finally {
            setLoading(false);
        }
    };

    useEffect(() => {
        void load();
    }, []);

    const stats = data?.stats;
    const config = data?.configuration;

    return (
        <>
            <Head title={t("Admin Overview")} />
            <div className="mx-auto w-full max-w-[1500px] space-y-6 p-3 sm:p-4 lg:p-6">
                <div className="flex flex-col gap-4 border-b border-border/60 pb-5 sm:flex-row sm:items-end sm:justify-between">
                    <div className="flex min-w-0 items-start gap-3">
                        <div className="mt-1 rounded-lg bg-primary/10 p-2 text-primary">
                            <Gauge className="size-5" />
                        </div>
                        <div className="min-w-0">
                            <h1 className="text-2xl font-semibold tracking-tight">
                                {t("Admin Overview")}
                            </h1>
                            <p className="mt-1 text-sm text-muted-foreground">
                                {t("Monitor customers, revenue, payments, and platform configuration.")}
                            </p>
                        </div>
                    </div>
                    <Button
                        variant="outline"
                        size="sm"
                        onClick={() => void load()}
                        disabled={loading}
                    >
                        <RefreshCw className={loading ? "animate-spin" : ""} />
                        {t("Refresh")}
                    </Button>
                </div>

                {error && (
                    <Card>
                        <CardContent className="flex items-center gap-3 py-4 text-sm text-destructive">
                            <XCircle className="size-4" />
                            {error}
                        </CardContent>
                    </Card>
                )}

                <div className="grid gap-3 sm:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-6">
                    <StatCard
                        title="Customers"
                        value={stats?.customers ?? 0}
                        icon={Users}
                    />
                    <StatCard
                        title={t("Active subscriptions")}
                        value={stats?.active_subscriptions ?? 0}
                        icon={CreditCard}
                    />
                    <StatCard
                        title={t("Pending payments")}
                        value={stats?.pending_payments ?? 0}
                        icon={WalletCards}
                    />
                    <StatCard
                        title={t("Paid today")}
                        value={stats?.paid_today ?? 0}
                        icon={Activity}
                    />
                    <StatCard
                        title={t("Revenue today")}
                        value={money(stats?.revenue_today ?? 0)}
                        icon={DollarSign}
                    />
                    <StatCard
                        title={t("Failed payments")}
                        value={stats?.failed_payments ?? 0}
                        icon={XCircle}
                    />
                </div>

                <div className="grid gap-4 lg:grid-cols-2">
                    <Card className="border-border/70 shadow-sm">
                        <CardHeader>
                            <CardTitle className="flex items-center gap-2 text-base">
                                <Gauge className="size-4" /> {t("Platform configuration")}</CardTitle>
                        </CardHeader>
                        <CardContent className="grid gap-3 sm:grid-cols-2">
                            <ConfigItem
                                label="Active plans"
                                value={config?.active_plans ?? 0}
                                href="/admin/subscription-plans"
                            />
                            <ConfigItem
                                label="Active gateways"
                                value={config?.active_gateways ?? 0}
                                href="/admin/payment-gateways"
                            />
                            <ConfigItem
                                label="Active market providers"
                                value={config?.active_market_providers ?? 0}
                                href="/admin/market-providers"
                            />
                            <ConfigItem
                                label="Active integrations"
                                value={config?.active_integrations ?? 0}
                                href="/admin/integrations"
                            />
                        </CardContent>
                    </Card>

                    <Card className="border-border/70 shadow-sm">
                        <CardHeader>
                            <CardTitle className="text-base">
                                {t("Quick actions")}</CardTitle>
                        </CardHeader>
                        <CardContent className="grid gap-2 sm:grid-cols-2">
                            <Button variant="outline" asChild>
                                <Link href="/admin/customers">{t("Customers")}</Link>
                            </Button>
                            <Button variant="outline" asChild>
                                <Link href="/admin/payments">{t("Payments")}</Link>
                            </Button>
                            <Button variant="outline" asChild>
                                <Link href="/admin/subscription-plans">
                                    {t("Subscription Plans")}</Link>
                            </Button>
                            <Button variant="outline" asChild>
                                <Link href="/admin/settings">{t("Settings")}</Link>
                            </Button>
                        </CardContent>
                    </Card>
                </div>

                <Card className="overflow-hidden border-border/70 shadow-sm">
                    <CardHeader className="border-b bg-muted/20">
                        <CardTitle className="text-base">
                            {t("Recent payments")}</CardTitle>
                    </CardHeader>
                    <CardContent>
                        <div className="overflow-x-auto">
                            <Table>
                                <TableHeader>
                                    <TableRow>
                                        <TableHead>{t("Reference")}</TableHead>
                                        <TableHead>{t("Customer")}</TableHead>
                                        <TableHead>{t("Plan")}</TableHead>
                                        <TableHead>{t("Gateway")}</TableHead>
                                        <TableHead>{t("Status")}</TableHead>
                                        <TableHead className="text-right">
                                            {t("Amount")}</TableHead>
                                        <TableHead>{t("Created")}</TableHead>
                                    </TableRow>
                                </TableHeader>
                                <TableBody>
                                    {(data?.recent_payments ?? []).map(
                                        (payment) => (
                                            <TableRow key={payment.id}>
                                                <TableCell>
                                                    <Link
                                                        className="font-medium hover:underline"
                                                        href={`/admin/payments/${payment.id}`}
                                                    >
                                                        {payment.reference}
                                                    </Link>
                                                </TableCell>
                                                <TableCell>
                                                    {payment.user?.name ?? "—"}
                                                </TableCell>
                                                <TableCell>
                                                    {payment.plan ?? "—"}
                                                </TableCell>
                                                <TableCell>
                                                    {payment.gateway ?? "—"}
                                                </TableCell>
                                                <TableCell>
                                                    <Badge
                                                        variant={statusVariant(
                                                            payment.status,
                                                        )}
                                                    >
                                                        {payment.status}
                                                    </Badge>
                                                </TableCell>
                                                <TableCell className="text-right">
                                                    {money(
                                                        Number(payment.amount),
                                                        payment.currency,
                                                    )}
                                                </TableCell>
                                                <TableCell className="whitespace-nowrap text-muted-foreground">
                                                    {date(payment.created_at)}
                                                </TableCell>
                                            </TableRow>
                                        ),
                                    )}
                                    {!loading &&
                                        (data?.recent_payments.length ?? 0) ===
                                            0 && (
                                            <TableRow>
                                                <TableCell
                                                    colSpan={7}
                                                    className="h-24 text-center text-muted-foreground"
                                                >
                                                    {t("Belum ada payment.")}</TableCell>
                                            </TableRow>
                                        )}
                                </TableBody>
                            </Table>
                        </div>
                    </CardContent>
                </Card>
            </div>
        </>
    );
}

function StatCard({
    title,
    value,
    icon: Icon,
}: {
    title: string;
    value: string | number;
    icon: typeof Users;
}) {
    return (
        <Card className="border-border/70 shadow-sm transition-colors hover:bg-muted/20">
            <CardContent className="flex items-center gap-3 p-4">
                <div className="rounded-lg border bg-muted/30 p-2 text-primary">
                    <Icon className="size-4" />
                </div>
                <div className="min-w-0">
                    <div className="truncate text-xs text-muted-foreground">
                        {title}
                    </div>
                    <div className="text-xl font-semibold">{value}</div>
                </div>
            </CardContent>
        </Card>
    );
}

function ConfigItem({
    label,
    value,
    href,
}: {
    label: string;
    value: number;
    href: string;
}) {
    return (
        <Link
            href={href}
            className="rounded-lg border border-border/70 bg-muted/10 p-3 transition-colors hover:bg-muted/40"
        >
            <div className="text-xs text-muted-foreground">{label}</div>
            <div className="mt-1 text-lg font-semibold">{value}</div>
        </Link>
    );
}
