import { Head, Link } from '@inertiajs/react';
import { ArrowUpRight, CalendarDays, FileText, FolderKanban, Mail, MailOpen, MonitorSmartphone, Users } from 'lucide-react';
import { Area, AreaChart, Bar, BarChart, CartesianGrid, Cell, Pie, PieChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts';
import { Avatar, AvatarFallback } from '@/components/ui/avatar';
import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
import { index as messagesIndex } from '@/routes/admin/messages';
import { index as visitorsIndex } from '@/routes/admin/visitors';

type Props = {
    can: {
        view_visitors: boolean;
        view_messages: boolean;
        view_posts: boolean;
        view_products: boolean;
        view_analytics: boolean;
    };
    stats: {
        total_visitors?: number;
        visitors_today?: number;
        unread_messages?: number;
        published_posts?: number;
        active_products?: number;
        total_users?: number;
    };
    visitorsChart: { date: string; label: string; visits: number }[];
    deviceChart: { name: string; value: number }[];
    consentChart: { name: string; value: number }[];
    recentMessages: {
        id: number;
        name: string;
        email: string;
        subject: string | null;
        is_read: boolean;
        created_at_human: string;
    }[];
    recentVisitors: {
        id: number;
        visitor_id: string;
        device_type: string | null;
        browser: string | null;
        country: string | null;
        city: string | null;
        consent: string;
        last_visit_human: string;
    }[];
};

// Warna chart memakai `var(--...)` LITERAL — nilai tema berformat oklch,
// jadi `hsl(var(--primary))` tidak valid. `var()` didukung di atribut SVG
// (presentation attribute) dan ikut cascade CSS, sehingga otomatis mengikuti
// tema light/dark tanpa re-render React.
const DEVICE_COLORS: Record<string, string> = {
    Desktop: 'var(--primary)',
    Mobile: 'var(--chart-2)',
    Tablet: 'var(--chart-3)',
};

const CONSENT_COLORS: Record<string, string> = {
    Diterima: 'var(--primary)',
    Ditolak: 'var(--destructive)',
    Menunggu: 'var(--muted-foreground)',
};

const MUTED_40 = 'color-mix(in oklab, var(--muted) 40%, transparent)';

function initials(name: string): string {
    return name
        .split(' ')
        .map((part) => part.charAt(0))
        .slice(0, 2)
        .join('')
        .toUpperCase();
}

export default function Dashboard({ can, stats, visitorsChart, deviceChart, consentChart, recentMessages, recentVisitors }: Props) {
    const statCards = [
        ...(can.view_visitors || can.view_analytics ? [{
            title: 'Total Pengunjung',
            value: stats.total_visitors ?? 0,
            icon: Users,
            hint: `${stats.visitors_today ?? 0} kunjungan hari ini`,
            link: { href: visitorsIndex(), label: 'Lihat analitik' },
        }] : []),
        ...(can.view_messages ? [{
            title: 'Pesan Belum Dibaca',
            value: stats.unread_messages ?? 0,
            icon: Mail,
            hint: 'Perlu tanggapan',
            link: { href: messagesIndex(), label: 'Buka inbox' },
        }] : []),
        ...(can.view_posts ? [{
            title: 'Postingan Terbit',
            value: stats.published_posts ?? 0,
            icon: FileText,
            hint: 'Tampil di halaman publik',
            link: { href: '/admin/posts', label: 'Kelola blog' },
        }] : []),
        ...(can.view_products ? [{
            title: 'Produk Aktif',
            value: stats.active_products ?? 0,
            icon: FolderKanban,
            hint: `${stats.total_users ?? 0} akun terdaftar`,
            link: { href: '/admin/products', label: 'Kelola produk' },
        }] : []),
    ];

    const totalVisits = visitorsChart.reduce((sum, row) => sum + row.visits, 0);

    return (
        <div className="space-y-6">
            <Head title="Dashboard" />

            <div className="flex flex-wrap items-center justify-between gap-4">
                <div>
                    <h1 className="text-2xl font-semibold tracking-tight">Dashboard</h1>
                    <p className="text-sm text-muted-foreground">
                        Ringkasan kunjungan, pesan, dan konten situs Anda.
                    </p>
                </div>
                {(can.view_visitors || can.view_analytics) && (
                    <Button asChild variant="outline" size="sm">
                        <Link href={visitorsIndex()}>
                            <CalendarDays className="size-4" />
                            Analitik Pengunjung
                        </Link>
                    </Button>
                )}
            </div>

            {/* Stat cards — gaya dashboard-01 */}
            <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-4">
                {statCards.map((card) => (
                    <Card key={card.title}>
                        <CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
                            <CardTitle className="text-sm font-medium">{card.title}</CardTitle>
                            <card.icon className="size-4 text-muted-foreground" />
                        </CardHeader>
                        <CardContent>
                            <div className="text-2xl font-bold tabular-nums">{card.value}</div>
                            <p className="mt-1 text-xs text-muted-foreground">{card.hint}</p>
                            <Button asChild variant="ghost" size="sm" className="mt-3 h-7 px-2 text-xs">
                                <Link href={card.link.href}>
                                    {card.link.label}
                                    <ArrowUpRight className="size-3" />
                                </Link>
                            </Button>
                        </CardContent>
                    </Card>
                ))}
            </div>

            {/* Baris utama: chart kunjungan + pesan terbaru */}
            {(can.view_visitors || can.view_analytics || can.view_messages) && (
            <div className="grid gap-4 md:gap-6 xl:grid-cols-7">
                {(can.view_visitors || can.view_analytics) && (
                <Card className="xl:col-span-4">
                    <CardHeader className="flex flex-row items-center justify-between pb-4">
                        <div className="space-y-1">
                            <CardTitle>Kunjungan 30 Hari Terakhir</CardTitle>
                            <CardDescription>
                                {totalVisits.toLocaleString('id-ID')} kunjungan tercatat dari pengunjung yang menyetujui cookie.
                            </CardDescription>
                        </div>
                    </CardHeader>
                    <CardContent>
                        <div className="h-[280px] w-full">
                            <ResponsiveContainer width="100%" height="100%">
                                <AreaChart data={visitorsChart} margin={{ top: 8, right: 8, left: -18, bottom: 12 }}>
                                    <defs>
                                        <linearGradient id="visits-fill" x1="0" y1="0" x2="0" y2="1">
                                            <stop offset="5%" stopColor="var(--primary)" stopOpacity={0.35} />
                                            <stop offset="95%" stopColor="var(--primary)" stopOpacity={0.02} />
                                        </linearGradient>
                                    </defs>
                                    <CartesianGrid vertical={false} strokeDasharray="3 3" className="stroke-border" />
                                    <XAxis
                                        dataKey="label"
                                        tickLine={false}
                                        axisLine={false}
                                        tickMargin={8}
                                        minTickGap={24}
                                        tick={{ fill: 'var(--muted-foreground)', fontSize: 11 }}
                                    />
                                    <YAxis
                                        allowDecimals={false}
                                        tickLine={false}
                                        axisLine={false}
                                        tick={{ fill: 'var(--muted-foreground)', fontSize: 11 }}
                                        domain={[0, 'dataMax']}
                                        padding={{ bottom: 8 }}
                                    />
                                    <Tooltip
                                        cursor={{ stroke: 'var(--border)' }}
                                        content={({ active, payload, label }) =>
                                            active && payload?.length ? (
                                                <div className="rounded-lg border bg-background px-3 py-2 text-xs shadow-sm">
                                                    <p className="font-medium">{label}</p>
                                                    <p className="text-muted-foreground">
                                                        <span className="font-semibold text-foreground">{payload[0].value}</span>{' '}
                                                        kunjungan
                                                    </p>
                                                </div>
                                            ) : null
                                        }
                                    />
                                    <Area
                                        type="monotone"
                                        dataKey="visits"
                                        stroke="var(--primary)"
                                        strokeWidth={2}
                                        fill="url(#visits-fill)"
                                        baseValue={0}
                                    />
                                </AreaChart>
                            </ResponsiveContainer>
                        </div>
                    </CardContent>
                </Card>
                )}

                {can.view_messages && (
                <Card className="xl:col-span-3">
                    <CardHeader className="flex flex-row items-center justify-between space-y-0 pb-4">
                        <div className="space-y-1">
                            <CardTitle>Pesan Terbaru</CardTitle>
                            <CardDescription>5 pesan terakhir yang masuk.</CardDescription>
                        </div>
                        <Button asChild variant="ghost" size="sm">
                            <Link href={messagesIndex()}>Lihat semua</Link>
                        </Button>
                    </CardHeader>
                    <CardContent className="space-y-4">
                        {recentMessages.length === 0 && (
                            <p className="text-sm text-muted-foreground">Belum ada pesan masuk.</p>
                        )}
                        {recentMessages.map((message) => (
                            <div key={message.id} className="flex items-center gap-4">
                                <Avatar className="size-9">
                                    <AvatarFallback>{initials(message.name)}</AvatarFallback>
                                </Avatar>
                                <div className="min-w-0 flex-1 space-y-0.5">
                                    <p className="truncate text-sm font-medium">{message.name}</p>
                                    <p className="truncate text-xs text-muted-foreground">
                                        {message.subject ?? 'Tanpa subjek'}
                                    </p>
                                </div>
                                <div className="flex shrink-0 flex-col items-end gap-1">
                                    <span className="text-xs text-muted-foreground">{message.created_at_human}</span>
                                    <Badge variant={message.is_read ? 'secondary' : 'default'} className="gap-1">
                                        {message.is_read ? <MailOpen className="size-3" /> : <Mail className="size-3" />}
                                        {message.is_read ? 'Dibaca' : 'Baru'}
                                    </Badge>
                                </div>
                            </div>
                        ))}
                    </CardContent>
                </Card>
                )}
            </div>
            )}

            {/* Baris kedua: perangkat + persetujuan cookie + pengunjung terbaru */}
            {(can.view_visitors || can.view_analytics) && (
            <div className="grid gap-4 md:gap-6 xl:grid-cols-7">
                <Card className="xl:col-span-3">
                    <CardHeader className="pb-4">
                        <CardTitle>Perangkat Pengunjung</CardTitle>
                        <CardDescription>Distribusi desktop, mobile, dan tablet.</CardDescription>
                    </CardHeader>
                    <CardContent>
                        <div className="h-[220px] w-full">
                            <ResponsiveContainer width="100%" height="100%">
                                <BarChart data={deviceChart} margin={{ top: 8, right: 8, left: -18, bottom: 0 }}>
                                    <CartesianGrid vertical={false} strokeDasharray="3 3" className="stroke-border" />
                                    <XAxis
                                        dataKey="name"
                                        tickLine={false}
                                        axisLine={false}
                                        tickMargin={8}
                                        tick={{ fill: 'var(--muted-foreground)', fontSize: 11 }}
                                    />
                                    <YAxis
                                        allowDecimals={false}
                                        tickLine={false}
                                        axisLine={false}
                                        tick={{ fill: 'var(--muted-foreground)', fontSize: 11 }}
                                    />
                                    <Tooltip
                                        cursor={{ fill: MUTED_40 }}
                                        content={({ active, payload }) =>
                                            active && payload?.length ? (
                                                <div className="rounded-lg border bg-background px-3 py-2 text-xs shadow-sm">
                                                    <p className="font-medium">{payload[0].payload.name}</p>
                                                    <p className="text-muted-foreground">
                                                        <span className="font-semibold text-foreground">{payload[0].value}</span>{' '}
                                                        pengunjung
                                                    </p>
                                                </div>
                                            ) : null
                                        }
                                    />
                                    <Bar dataKey="value" radius={[4, 4, 0, 0]} maxBarSize={48}>
                                        {deviceChart.map((entry) => (
                                            <Cell key={entry.name} fill={DEVICE_COLORS[entry.name] ?? 'var(--primary)'} />
                                        ))}
                                    </Bar>
                                </BarChart>
                            </ResponsiveContainer>
                        </div>
                    </CardContent>
                </Card>

                <Card className="xl:col-span-2">
                    <CardHeader className="pb-4">
                        <CardTitle>Persetujuan Cookie</CardTitle>
                        <CardDescription>Respons popup cookie di halaman publik.</CardDescription>
                    </CardHeader>
                    <CardContent className="flex items-center gap-4">
                        <div className="h-[150px] w-1/2">
                            <ResponsiveContainer width="100%" height="100%">
                                <PieChart>
                                    <Pie
                                        data={consentChart}
                                        dataKey="value"
                                        nameKey="name"
                                        innerRadius={42}
                                        outerRadius={68}
                                        paddingAngle={2}
                                        strokeWidth={0}
                                    >
                                        {consentChart.map((entry) => (
                                            <Cell key={entry.name} fill={CONSENT_COLORS[entry.name] ?? 'var(--primary)'} />
                                        ))}
                                    </Pie>
                                    <Tooltip
                                        content={({ active, payload }) =>
                                            active && payload?.length ? (
                                                <div className="rounded-lg border bg-background px-3 py-2 text-xs shadow-sm">
                                                    <p className="font-medium">{payload[0].name}</p>
                                                    <p className="text-muted-foreground">
                                                        <span className="font-semibold text-foreground">{payload[0].value}</span>{' '}
                                                        pengunjung
                                                    </p>
                                                </div>
                                            ) : null
                                        }
                                    />
                                </PieChart>
                            </ResponsiveContainer>
                        </div>
                        <div className="flex-1 space-y-2">
                            {consentChart.map((entry) => (
                                <div key={entry.name} className="flex items-center justify-between text-sm">
                                    <span className="flex items-center gap-2 text-muted-foreground">
                                        <span
                                            className="size-2.5 rounded-full"
                                            style={{ background: CONSENT_COLORS[entry.name] ?? 'var(--primary)' }}
                                        />
                                        {entry.name}
                                    </span>
                                    <span className="font-medium tabular-nums">{entry.value}</span>
                                </div>
                            ))}
                        </div>
                    </CardContent>
                </Card>

                <Card className="xl:col-span-2">
                    <CardHeader className="flex flex-row items-center justify-between space-y-0 pb-4">
                        <div className="space-y-1">
                            <CardTitle>Pengunjung Terbaru</CardTitle>
                            <CardDescription>Aktivitas terakhir di situs.</CardDescription>
                        </div>
                        <Button asChild variant="ghost" size="sm">
                            <Link href={visitorsIndex()}>Semua</Link>
                        </Button>
                    </CardHeader>
                    <CardContent className="space-y-4">
                        {recentVisitors.length === 0 && (
                            <p className="text-sm text-muted-foreground">Belum ada data pengunjung.</p>
                        )}
                        {recentVisitors.map((visitor) => (
                            <div key={visitor.id} className="flex items-center gap-3">
                                <div className="flex size-8 shrink-0 items-center justify-center rounded-lg bg-muted">
                                    <MonitorSmartphone className="size-4 text-muted-foreground" />
                                </div>
                                <div className="min-w-0 flex-1">
                                    <p className="truncate text-sm font-medium">
                                        {visitor.country
                                            ? [visitor.city, visitor.country].filter(Boolean).join(', ')
                                            : 'Lokasi tidak diketahui'}
                                    </p>
                                    <p className="truncate text-xs text-muted-foreground">
                                        {visitor.browser ?? 'Browser tidak diketahui'} · {visitor.last_visit_human}
                                    </p>
                                </div>
                                <Badge
                                    variant={visitor.consent === 'accepted' ? 'default' : visitor.consent === 'declined' ? 'secondary' : 'outline'}
                                    className="gap-1"
                                >
                                    {visitor.consent === 'accepted'
                                        ? 'Diterima'
                                        : visitor.consent === 'declined'
                                          ? 'Ditolak'
                                          : 'Menunggu'}
                                </Badge>
                            </div>
                        ))}
                    </CardContent>
                </Card>
            </div>
            )}
        </div>
    );
}
