import { ComponentProps, useMemo } from "react";
import { Head, router } from "@inertiajs/react";
import {
    AlertTriangle,
    BarChart3,
    CheckCircle2,
    Filter,
    MapPinned,
    RefreshCcw,
    UserRoundCheck,
    Users,
} from "lucide-react";
import AppLayout from "@/layouts/app-layout";
import CrmOsmMap from "@/components/crm-osm-map";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import {
    Select,
    SelectContent,
    SelectItem,
    SelectTrigger,
    SelectValue,
} from "@/components/ui/select";

// Reusable StatChip dari Global Card
import { StatChip } from "@/components/crm/global-card";

// Ekstrak tipe elemen array points secara aman
type MapPoint = NonNullable<ComponentProps<typeof CrmOsmMap>["points"]>[number];

type Option = {
    id: number;
    name: string;
    code?: string;
    latitude?: string | number | null;
    longitude?: string | number | null;
    radius_meters?: number | null;
};

type Props = {
    points: MapPoint[];
    areas: Option[];
    salesUsers: Option[];
    filters: { area_id?: number | null; sales_id?: number | null };
    stats: { mapped: number; missing_coordinates: number };
};

export default function CustomerMap({
    points,
    areas,
    salesUsers,
    filters,
    stats,
}: Props) {
    const areaId = filters.area_id ? String(filters.area_id) : "";
    const salesId = filters.sales_id ? String(filters.sales_id) : "";

    const selectedArea = areas.find((area) => String(area.id) === areaId);
    const selectedSales = salesUsers.find(
        (sales) => String(sales.id) === salesId,
    );

    const applyFilters = (nextArea = areaId, nextSales = salesId) => {
        router.get(
            "/crm/customer-map",
            {
                area_id: nextArea || undefined,
                sales_id: nextSales || undefined,
            },
            { preserveState: true, preserveScroll: true, replace: true },
        );
    };

    const selectArea = (value: string) => {
        const nextArea = value === "all" ? "" : value;
        // Reset pilihan sales saat area diganti agar tidak mengunci filter sales dari area sebelumnya
        applyFilters(nextArea, "");
    };

    const mappedPercent =
        stats.mapped + stats.missing_coordinates > 0
            ? Math.round(
                  (stats.mapped / (stats.mapped + stats.missing_coordinates)) *
                      100,
              )
            : 0;

    const number = (value: number) =>
        new Intl.NumberFormat("id-ID").format(value || 0);

    // Memoisasi transformasi array areas untuk mencegah re-render peta berlebih
    const formattedAreas = useMemo(() => {
        return areas.map((area) => ({
            id: area.id,
            name: area.name,
            code: area.code,
            lat: area.latitude == null ? null : Number(area.latitude),
            lng: area.longitude == null ? null : Number(area.longitude),
            radius_meters: area.radius_meters,
        }));
    }, [areas]);

    return (
        <AppLayout
            breadcrumbs={[
                { title: "Peta Customer", href: "/crm/customer-map" },
            ]}
        >
            <Head title="Peta Customer" />

            <div className="crm-page space-y-6 pb-10">
                {/* Page header */}
                <section className="relative overflow-hidden rounded-3xl border border-indigo-100 bg-card shadow-[0_12px_40px_rgba(79,70,229,0.07)] dark:border-slate-800 dark:bg-slate-900 dark:shadow-none">
                    <div className="absolute -right-20 -top-28 h-64 w-64 rounded-full bg-indigo-100/70 blur-3xl dark:bg-indigo-950/30" />
                    <div className="absolute -bottom-24 left-1/3 h-48 w-48 rounded-full bg-cyan-100/60 blur-3xl dark:bg-cyan-950/20" />
                    <div className="relative flex flex-col gap-6 p-6 md:p-8 lg:flex-row lg:items-center lg:justify-between">
                        <div className="max-w-2xl">
                            <div className="mb-3 inline-flex items-center gap-2 rounded-full border border-indigo-100 bg-indigo-50 px-3 py-1.5 text-xs font-bold text-indigo-700 dark:border-indigo-900/50 dark:bg-indigo-950/50 dark:text-indigo-300">
                                <MapPinned className="size-3.5" />
                                Customer Intelligence
                            </div>
                            <h1 className="text-3xl font-black tracking-[-0.035em] text-slate-950 md:text-4xl dark:text-slate-50">
                                Peta Customer
                            </h1>
                            <p className="mt-2 max-w-xl text-sm leading-6 text-muted-foreground md:text-base dark:text-muted-foreground/80">
                                Pahami persebaran pelanggan, fokuskan kunjungan,
                                dan bantu tim sales mengambil keputusan berbasis
                                wilayah.
                            </p>
                        </div>

                        <div className="flex shrink-0 items-center gap-3 rounded-2xl border border-border bg-card/80 px-4 py-3 shadow-xs backdrop-blur dark:border-slate-800 dark:bg-slate-900/80">
                            <div className="grid size-10 place-items-center rounded-xl bg-indigo-50 text-indigo-600 dark:bg-indigo-950/50 dark:text-indigo-400">
                                <BarChart3 className="size-5" />
                            </div>
                            <div>
                                <div className="text-xs font-medium text-muted-foreground/80 dark:text-muted-foreground">
                                    Customer terpetakan
                                </div>
                                <div className="text-xl font-extrabold tracking-tight text-foreground dark:text-slate-100">
                                    {mappedPercent}%
                                </div>
                            </div>
                        </div>
                    </div>
                </section>

                {/* KPI Metrics */}
                <div className="grid gap-4 sm:grid-cols-2 lg:grid-cols-3">
                    <StatChip
                        icon={Users}
                        label="Total Customer Terpetakan"
                        value={number(stats.mapped)}
                        tone="blue"
                        description="Customer yang memiliki titik koordinat"
                        variant="compact"
                    />
                    <StatChip
                        icon={UserRoundCheck}
                        label="Customer Tampil di Peta"
                        value={number(points.length)}
                        tone="emerald"
                        description="Customer aktif sesuai filter"
                        variant="compact"
                    />
                    <StatChip
                        icon={AlertTriangle}
                        label="Tanpa Koordinat GPS"
                        value={number(stats.missing_coordinates)}
                        tone="orange"
                        description="Perlu pembaruan lokasi"
                        variant="compact"
                    />
                </div>

                {/* Filters */}
                <Card className="border-border/80 dark:border-slate-800 dark:bg-slate-900">
                    <CardHeader className="border-b border-slate-100 bg-muted/50/50 dark:border-slate-800 dark:bg-slate-900/50">
                        <div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
                            <div className="flex items-start gap-3">
                                <div className="grid size-10 shrink-0 place-items-center rounded-xl bg-slate-900 text-white shadow-xs dark:bg-muted dark:text-foreground">
                                    <Filter className="size-4" />
                                </div>
                                <div>
                                    <CardTitle className="text-base font-bold text-foreground dark:text-slate-100">
                                        Filter Wilayah
                                    </CardTitle>
                                    <p className="mt-0.5 text-xs leading-5 text-muted-foreground dark:text-muted-foreground/80">
                                        Pilih area dan sales untuk melihat
                                        customer yang relevan.
                                    </p>
                                </div>
                            </div>

                            {(selectedArea || selectedSales) && (
                                <div className="flex flex-wrap gap-2">
                                    {selectedArea && (
                                        <Badge className="rounded-full border-indigo-100 bg-indigo-50 px-3 py-1 text-indigo-700 hover:bg-indigo-50 dark:border-indigo-900/50 dark:bg-indigo-950/50 dark:text-indigo-300">
                                            Area:{" "}
                                            {selectedArea.code
                                                ? `${selectedArea.code} — `
                                                : ""}
                                            {selectedArea.name}
                                        </Badge>
                                    )}
                                    {selectedSales && (
                                        <Badge className="rounded-full border-sky-100 bg-sky-50 px-3 py-1 text-sky-700 hover:bg-sky-50 dark:border-sky-900/50 dark:bg-sky-950/50 dark:text-sky-300">
                                            Sales: {selectedSales.name}
                                        </Badge>
                                    )}
                                </div>
                            )}
                        </div>
                    </CardHeader>

                    <CardContent className="flex flex-col gap-3 pt-6 md:flex-row">
                        <Select
                            value={areaId || "all"}
                            onValueChange={selectArea}
                        >
                            <SelectTrigger className="h-11 w-full rounded-xl border-border bg-muted/50/60 shadow-none focus:ring-2 focus:ring-indigo-500/20 md:w-50 dark:border-slate-800 dark:bg-slate-800/50">
                                <SelectValue placeholder="Semua Area" />
                            </SelectTrigger>
                            <SelectContent className="rounded-xl">
                                <SelectItem value="all">Semua Area</SelectItem>
                                {areas.map((area) => (
                                    <SelectItem
                                        key={area.id}
                                        value={String(area.id)}
                                    >
                                        {area.code ? `${area.code} — ` : ""}
                                        {area.name}
                                    </SelectItem>
                                ))}
                            </SelectContent>
                        </Select>

                        <Select
                            value={salesId || "all"}
                            onValueChange={(value) =>
                                applyFilters(
                                    areaId,
                                    value === "all" ? "" : value,
                                )
                            }
                        >
                            <SelectTrigger className="h-11 w-full rounded-xl border-border bg-muted/50/60 shadow-none focus:ring-2 focus:ring-indigo-500/20 md:w-50 dark:border-slate-800 dark:bg-slate-800/50">
                                <SelectValue placeholder="Semua Sales" />
                            </SelectTrigger>
                            <SelectContent className="rounded-xl">
                                <SelectItem value="all">
                                    {areaId
                                        ? "Semua Sales di Area"
                                        : "Semua Sales"}
                                </SelectItem>
                                {salesUsers.map((sales) => (
                                    <SelectItem
                                        key={sales.id}
                                        value={String(sales.id)}
                                    >
                                        {sales.name}
                                    </SelectItem>
                                ))}
                            </SelectContent>
                        </Select>

                        {/* Tombol Reset hanya akan tampil saat terdapat filter terpilih */}
                        {(selectedArea || selectedSales) && (
                            <Button
                                variant="outline"
                                className="cursor-pointer rounded-xl border-border px-4 text-foreground/80 hover:bg-muted dark:border-slate-800 dark:text-muted-foreground/60 dark:hover:bg-slate-800"
                                onClick={() => applyFilters("", "")}
                            >
                                <RefreshCcw className="mr-2 size-4" />
                                Reset filter
                            </Button>
                        )}
                    </CardContent>
                </Card>

                {/* Map */}
                <Card className="relative z-0 overflow-hidden border-border/80 pb-0 dark:border-slate-800 dark:bg-slate-900">
                    <CardHeader className="border-b border-slate-100 bg-card dark:border-slate-800 dark:bg-slate-900">
                        <div className="flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between">
                            <div>
                                <CardTitle className="text-base font-bold text-foreground dark:text-slate-100">
                                    Persebaran Customer
                                </CardTitle>
                                <p className="mt-1 text-xs text-muted-foreground/80 dark:text-muted-foreground">
                                    {points.length} titik customer ditampilkan
                                    pada area yang dipilih.
                                </p>
                            </div>
                            <div className="inline-flex items-center gap-2 self-start rounded-full bg-emerald-50 px-3 py-1.5 text-xs font-semibold text-emerald-700 dark:bg-emerald-950/60 dark:text-emerald-300">
                                <CheckCircle2 className="size-3.5" />
                                Data peta aktif
                            </div>
                        </div>
                    </CardHeader>
                    <CardContent className="p-0">
                        <CrmOsmMap
                            points={points}
                            areas={formattedAreas}
                            height={620}
                        />
                    </CardContent>
                </Card>
            </div>
        </AppLayout>
    );
}
