import { FormEvent, useState } from "react";
import { Head, Link, router, useForm } from "@inertiajs/react";
import {
    ArrowLeft,
    CheckCircle2,
    Eye,
    ShieldCheck,
    XCircle,
} from "lucide-react";

import AppLayout from "@/layouts/app-layout";
import { Button } from "@/components/ui/button";
import { Label } from "@/components/ui/label";
import { Textarea } from "@/components/ui/textarea";
import { StatusBadge } from "@/components/crm-data-table";
import {
    Dialog,
    DialogContent,
    DialogFooter,
    DialogHeader,
    DialogTitle,
} from "@/components/ui/dialog";

type Order = {
    id: number;
    order_number: string;
    order_date: string;
    grand_total: string | number;
    status: string;
    customer?: { name: string };
    sales?: { name: string; team?: { name: string } };
    visit?: {
        id: number;
        status: string;
        checkin_at?: string;
        checkout_at?: string;
        schedule?: {
            scheduled_date: string;
            scheduled_time?: string;
            purpose: string;
        };
    };
    items?: Array<{ id: number; qty: number; product?: { name: string } }>;
};

type Props = {
    orders: { data: Order[]; links: any[]; meta?: any };
};

export default function Approval({ orders }: Props) {
    const [selected, setSelected] = useState<Order | null>(null);
    const [rejectOpen, setRejectOpen] = useState(false);
    const reject = useForm({ remarks: "" });

    const approve = (order: Order) => {
        router.post(
            `/crm/orders/${order.id}/approve`,
            {},
            { preserveScroll: true },
        );
    };

    const openReject = (order: Order) => {
        setSelected(order);
        reject.reset();
        setRejectOpen(true);
    };

    const submitReject = (event: FormEvent) => {
        event.preventDefault();
        if (!selected) return;
        reject.post(`/crm/orders/${selected.id}/reject`, {
            preserveScroll: true,
            onSuccess: () => {
                setRejectOpen(false);
                setSelected(null);
                reject.reset();
            },
        });
    };

    return (
        <AppLayout
            breadcrumbs={[
                { title: "Orders", href: "/crm/orders" },
                { title: "Approval", href: "/crm/orders/approval" },
            ]}
        >
            <Head title="Approval Order" />

            <div className="crm-page space-y-6 pb-10">
                <div className="flex flex-col gap-4 md:flex-row md:items-center md:justify-between">
                    <div className="flex items-center gap-3">
                        <Link href="/crm/orders">
                            <Button
                                variant="outline"
                                size="icon"
                                className="h-9 w-9"
                            >
                                <ArrowLeft className="h-4 w-4" />
                            </Button>
                        </Link>
                        <div>
                            <div className="flex items-center gap-2">
                                <ShieldCheck className="h-5 w-5 text-indigo-600" />
                                <h1 className="text-2xl font-semibold tracking-tight">
                                    Approval Order
                                </h1>
                            </div>
                            <p className="text-sm text-muted-foreground">
                                Order submitted yang menunggu keputusan
                                Supervisor / Manager.
                            </p>
                        </div>
                    </div>
                </div>

                <div className="rounded-xl border bg-card shadow-sm overflow-hidden">
                    <div className="border-b px-5 py-4">
                        <div className="flex items-center justify-between gap-3">
                            <div>
                                <h2 className="font-semibold">
                                    Menunggu Approval
                                </h2>
                                <p className="text-xs text-muted-foreground">
                                    Periksa konteks Visit sebelum menyetujui
                                    order.
                                </p>
                            </div>
                            <div className="text-sm font-semibold">
                                {orders.data.length} order
                            </div>
                        </div>
                    </div>

                    <div className="overflow-x-auto">
                        <table className="w-full text-sm">
                            <thead className="bg-muted/40 text-xs text-muted-foreground">
                                <tr>
                                    <th className="px-5 py-3 text-left">
                                        Order
                                    </th>
                                    <th className="px-5 py-3 text-left">
                                        Customer
                                    </th>
                                    <th className="px-5 py-3 text-left">
                                        Sales
                                    </th>
                                    <th className="px-5 py-3 text-left">
                                        Visit
                                    </th>
                                    <th className="px-5 py-3 text-right">
                                        Total
                                    </th>
                                    <th className="px-5 py-3 text-right">
                                        Aksi
                                    </th>
                                </tr>
                            </thead>
                            <tbody>
                                {orders.data.map((order) => (
                                    <tr
                                        key={order.id}
                                        className="border-t hover:bg-muted/20"
                                    >
                                        <td className="px-5 py-4">
                                            <div className="font-semibold">
                                                {order.order_number}
                                            </div>
                                            <div className="text-xs text-muted-foreground">
                                                {new Date(
                                                    order.order_date,
                                                ).toLocaleDateString("id-ID")}
                                            </div>
                                        </td>
                                        <td className="px-5 py-4">
                                            {order.customer?.name ?? "-"}
                                        </td>
                                        <td className="px-5 py-4">
                                            <div>
                                                {order.sales?.name ?? "-"}
                                            </div>
                                            <div className="text-xs text-muted-foreground">
                                                {order.sales?.team?.name ?? "-"}
                                            </div>
                                        </td>
                                        <td className="px-5 py-4">
                                            {order.visit ? (
                                                <div>
                                                    <div className="font-medium">
                                                        #{order.visit.id}
                                                    </div>
                                                    <div className="text-xs text-muted-foreground">
                                                        {order.visit.status}
                                                    </div>
                                                </div>
                                            ) : (
                                                "Manual order"
                                            )}
                                        </td>
                                        <td className="px-5 py-4 text-right font-bold">
                                            Rp{" "}
                                            {Number(
                                                order.grand_total,
                                            ).toLocaleString("id-ID")}
                                        </td>
                                        <td className="px-5 py-4">
                                            <div className="flex justify-end gap-2">
                                                <Button
                                                    size="sm"
                                                    variant="outline"
                                                    onClick={() =>
                                                        setSelected(order)
                                                    }
                                                >
                                                    <Eye className="mr-1 h-3.5 w-3.5" />{" "}
                                                    Detail
                                                </Button>
                                                <Button
                                                    size="sm"
                                                    onClick={() =>
                                                        approve(order)
                                                    }
                                                >
                                                    <CheckCircle2 className="mr-1 h-3.5 w-3.5" />{" "}
                                                    Approve
                                                </Button>
                                                <Button
                                                    size="sm"
                                                    variant="destructive"
                                                    onClick={() =>
                                                        openReject(order)
                                                    }
                                                >
                                                    <XCircle className="mr-1 h-3.5 w-3.5" />{" "}
                                                    Reject
                                                </Button>
                                            </div>
                                        </td>
                                    </tr>
                                ))}
                                {orders.data.length === 0 && (
                                    <tr>
                                        <td
                                            colSpan={6}
                                            className="px-5 py-12 text-center text-muted-foreground"
                                        >
                                            Tidak ada order yang menunggu
                                            approval.
                                        </td>
                                    </tr>
                                )}
                            </tbody>
                        </table>
                    </div>
                </div>

                {selected && !rejectOpen && (
                    <Dialog
                        open
                        onOpenChange={(open) => !open && setSelected(null)}
                    >
                        <DialogContent className="max-w-lg">
                            <DialogHeader>
                                <DialogTitle>
                                    {selected.order_number}
                                </DialogTitle>
                            </DialogHeader>
                            <div className="space-y-4 text-sm">
                                <div className="grid grid-cols-2 gap-3">
                                    <div>
                                        <Label>Customer</Label>
                                        <div className="mt-1 font-medium">
                                            {selected.customer?.name ?? "-"}
                                        </div>
                                    </div>
                                    <div>
                                        <Label>Sales</Label>
                                        <div className="mt-1 font-medium">
                                            {selected.sales?.name ?? "-"}
                                        </div>
                                    </div>
                                    <div>
                                        <Label>Visit</Label>
                                        <div className="mt-1">
                                            {selected.visit
                                                ? `#${selected.visit.id} · ${selected.visit.status}`
                                                : "Manual order"}
                                        </div>
                                    </div>
                                    <div>
                                        <Label>Status</Label>
                                        <div className="mt-1">
                                            <StatusBadge
                                                status={selected.status}
                                            />
                                        </div>
                                    </div>
                                </div>
                                {selected.visit && (
                                    <div className="rounded-lg border bg-muted/30 p-3">
                                        <div className="font-medium">
                                            Konteks Visit
                                        </div>
                                        <div className="mt-2 grid grid-cols-2 gap-2 text-xs text-muted-foreground">
                                            <div>
                                                Check-in:{" "}
                                                {selected.visit.checkin_at
                                                    ? new Date(
                                                          selected.visit
                                                              .checkin_at,
                                                      ).toLocaleString("id-ID")
                                                    : "-"}
                                            </div>
                                            <div>
                                                Check-out:{" "}
                                                {selected.visit.checkout_at
                                                    ? new Date(
                                                          selected.visit
                                                              .checkout_at,
                                                      ).toLocaleString("id-ID")
                                                    : "-"}
                                            </div>
                                            <div>
                                                Purpose:{" "}
                                                {selected.visit.schedule
                                                    ?.purpose ?? "-"}
                                            </div>
                                            <div>
                                                Jadwal:{" "}
                                                {selected.visit.schedule
                                                    ?.scheduled_date ?? "-"}
                                            </div>
                                        </div>
                                    </div>
                                )}
                                <div className="flex justify-between rounded-lg border p-3 font-bold">
                                    <span>Total Order</span>
                                    <span>
                                        Rp{" "}
                                        {Number(
                                            selected.grand_total,
                                        ).toLocaleString("id-ID")}
                                    </span>
                                </div>
                            </div>
                        </DialogContent>
                    </Dialog>
                )}

                <Dialog open={rejectOpen} onOpenChange={setRejectOpen}>
                    <DialogContent>
                        <DialogHeader>
                            <DialogTitle>
                                Tolak {selected?.order_number}
                            </DialogTitle>
                        </DialogHeader>
                        <form onSubmit={submitReject} className="space-y-4">
                            <div>
                                <Label htmlFor="remarks">
                                    Alasan penolakan
                                </Label>
                                <Textarea
                                    id="remarks"
                                    value={reject.data.remarks}
                                    onChange={(e) =>
                                        reject.setData(
                                            "remarks",
                                            e.target.value,
                                        )
                                    }
                                    className="mt-2 min-h-28"
                                    placeholder="Jelaskan alasan order ditolak..."
                                />
                                {reject.errors.remarks && (
                                    <p className="mt-1 text-xs text-destructive">
                                        {reject.errors.remarks}
                                    </p>
                                )}
                            </div>
                            <DialogFooter>
                                <Button
                                    type="button"
                                    variant="outline"
                                    onClick={() => setRejectOpen(false)}
                                >
                                    Batal
                                </Button>
                                <Button
                                    type="submit"
                                    variant="destructive"
                                    disabled={reject.processing}
                                >
                                    Tolak Order
                                </Button>
                            </DialogFooter>
                        </form>
                    </DialogContent>
                </Dialog>
            </div>
        </AppLayout>
    );
}
