import { Head } from "@inertiajs/react";
import { useEffect, useState } from "react";
import { RefreshCw, Save } from "lucide-react";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
import { Card } from "@/components/ui/card";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";

import { useI18n } from "@/lib/i18n";
type Settings = {
    enabled: boolean;
    reward_per_registration: number | string;
    max_referrals_per_user: number;
};

type UserRow = {
    id: number;
    name: string;
    email: string;
    referral_code: string | null;
    referrals: number;
    credit_balance: number;
};

type Data = {
    settings: Settings;
    total_referrals: number;
    total_credit_issued: number;
    total_credit_redeemed: number;
    users: UserRow[];
};

const csrf = () =>
    document.querySelector<HTMLMetaElement>('meta[name="csrf-token"]')?.content ?? "";

export default function AdminReferrals() {
    const { t } = useI18n();
    const [data, setData] = useState<Data | null>(null);
    const [message, setMessage] = useState("");
    const [saving, setSaving] = useState(false);

    const load = async () => {
        const response = await fetch("/admin/referrals/data", {
            headers: { Accept: "application/json" },
        });
        if (response.ok) setData(await response.json());
    };

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

    const save = async () => {
        if (!data) return;
        setSaving(true);
        setMessage("");
        try {
            const response = await fetch("/admin/referrals/settings", {
                method: "PUT",
                headers: {
                    Accept: "application/json",
                    "Content-Type": "application/json",
                    "X-CSRF-TOKEN": csrf(),
                },
                body: JSON.stringify({
                    enabled: data.settings.enabled,
                    reward_per_registration: Number(data.settings.reward_per_registration),
                    max_referrals_per_user: Number(data.settings.max_referrals_per_user),
                }),
            });
            const payload = await response.json().catch(() => ({}));
            if (!response.ok) throw new Error(payload.message ?? "Unable to save settings.");
            setMessage("Referral settings saved.");
            await load();
        } catch (error) {
            setMessage(error instanceof Error ? error.message : "Unable to save settings.");
        } finally {
            setSaving(false);
        }
    };

    return (
        <>
            <Head title={t("Referral Program")} />
            <div className="p-3 sm:p-4 lg:p-6">
                <div className="mx-auto max-w-6xl">
                    <div className="mb-6 flex flex-wrap items-center justify-between gap-3">
                        <div>
                            <h1 className="text-2xl font-semibold">{t("Referral Program")}</h1>
                            <p className="mt-1 text-sm text-muted-foreground">
                                {t("Configure referral credit and monitor referral usage.")}</p>
                        </div>
                        <Button variant="outline" onClick={() => void load()} className="gap-2">
                            <RefreshCw className="size-4" /> {t("Refresh")}</Button>
                    </div>

                    {data && (
                        <>
                            <div className="grid gap-4 md:grid-cols-3">
                                <Card className="rounded-2xl p-5">
                                    <p className="text-sm text-muted-foreground">{t("Total referrals")}</p>
                                    <p className="mt-1 text-2xl font-bold">{data.total_referrals}</p>
                                </Card>
                                <Card className="rounded-2xl p-5">
                                    <p className="text-sm text-muted-foreground">{t("Credit issued")}</p>
                                    <p className="mt-1 text-2xl font-bold">${data.total_credit_issued.toFixed(2)}</p>
                                </Card>
                                <Card className="rounded-2xl p-5">
                                    <p className="text-sm text-muted-foreground">{t("Credit redeemed")}</p>
                                    <p className="mt-1 text-2xl font-bold">${data.total_credit_redeemed.toFixed(2)}</p>
                                </Card>
                            </div>

                            <Card className="mt-5 rounded-2xl p-6">
                                <div className="grid gap-5 md:grid-cols-3">
                                    <div>
                                        <Label>{t("Referral Program")}</Label>
                                        <div className="mt-2">
                                            <Button
                                                type="button"
                                                variant={data.settings.enabled ? "default" : "outline"}
                                                onClick={() => setData({
                                                    ...data,
                                                    settings: { ...data.settings, enabled: !data.settings.enabled },
                                                })}
                                            >
                                                {data.settings.enabled ? "Enabled" : "Disabled"}
                                            </Button>
                                        </div>
                                    </div>
                                    <div>
                                        <Label htmlFor="reward">{t("Reward per registration")}</Label>
                                        <Input
                                            id="reward"
                                            className="mt-2"
                                            type="number"
                                            min="0"
                                            step="0.01"
                                            value={data.settings.reward_per_registration}
                                            onChange={(e) => setData({
                                                ...data,
                                                settings: { ...data.settings, reward_per_registration: e.target.value },
                                            })}
                                        />
                                    </div>
                                    <div>
                                        <Label htmlFor="limit">{t("Maximum referrals / trader")}</Label>
                                        <Input
                                            id="limit"
                                            className="mt-2"
                                            type="number"
                                            min="0"
                                            step="1"
                                            value={data.settings.max_referrals_per_user}
                                            onChange={(e) => setData({
                                                ...data,
                                                settings: { ...data.settings, max_referrals_per_user: Number(e.target.value) },
                                            })}
                                        />
                                    </div>
                                </div>
                                <div className="mt-5 flex items-center gap-3">
                                    <Button onClick={() => void save()} disabled={saving} className="gap-2">
                                        <Save className="size-4" /> {saving ? "Saving..." : "Save settings"}
                                    </Button>
                                    {message && <span className="text-sm text-muted-foreground">{message}</span>}
                                </div>
                            </Card>

                            <Card className="mt-5 overflow-hidden rounded-2xl">
                                <div className="border-b p-5">
                                    <h2 className="font-semibold">{t("Top Referrers")}</h2>
                                </div>
                                <div className="overflow-x-auto">
                                    <table className="w-full text-left text-sm">
                                        <thead className="border-b bg-muted/30">
                                            <tr>
                                                <th className="px-5 py-3">{t("Trader")}</th>
                                                <th className="px-5 py-3">{t("Code")}</th>
                                                <th className="px-5 py-3">{t("Referrals")}</th>
                                                <th className="px-5 py-3">{t("Credit")}</th>
                                            </tr>
                                        </thead>
                                        <tbody>
                                            {data.users.map((user) => (
                                                <tr key={user.id} className="border-b last:border-0">
                                                    <td className="px-5 py-3">
                                                        <div className="font-medium">{user.name}</div>
                                                        <div className="text-xs text-muted-foreground">{user.email}</div>
                                                    </td>
                                                    <td className="px-5 py-3 font-mono">{user.referral_code}</td>
                                                    <td className="px-5 py-3">
                                                        <Badge variant="outline">
                                                            {user.referrals} / {data.settings.max_referrals_per_user}
                                                        </Badge>
                                                    </td>
                                                    <td className="px-5 py-3 font-semibold">${user.credit_balance.toFixed(2)}</td>
                                                </tr>
                                            ))}
                                        </tbody>
                                    </table>
                                </div>
                            </Card>
                        </>
                    )}
                </div>
            </div>
        </>
    );
}
