import { Head, router } from "@inertiajs/react";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { Input } from "@/components/ui/input";
import { Button } from "@/components/ui/button";
import { useState } from "react";

import {
    Table,
    TableBody,
    TableCell,
    TableHead,
    TableHeader,
    TableRow,
} from "@/components/ui/table";
import AppLayout from "@/layouts/app-layout";
const money = (value: number | string) =>
    new Intl.NumberFormat("id-ID", {
        style: "currency",
        currency: "IDR",
        maximumFractionDigits: 0,
    }).format(Number(value || 0));

type Props = {
    month: string;
    summary: Record<string, number>;
    salesPerformance: any[];
    visitPerformance: any[];
    paymentByMethod: any[];
};

export default function Reports({
    month,
    summary,
    salesPerformance,
    visitPerformance,
    paymentByMethod,
}: Props) {
    const [selectedMonth, setSelectedMonth] = useState(month);
    const apply = () =>
        router.get(
            "/crm/reports",
            { month: selectedMonth },
            { preserveState: true, preserveScroll: true },
        );
    return (
        <AppLayout
            breadcrumbs={[{ title: "Pengiriman", href: "/crm/reports" }]}
        >
            <Head title="Reports" />
            <div className="space-y-6 p-4 md:p-6">
                <div className="flex flex-col gap-3 md:flex-row md:items-end md:justify-between">
                    <div>
                        <h1 className="text-2xl font-semibold">Reports</h1>
                        <p className="text-sm text-muted-foreground">
                            Analisis penjualan, kunjungan dan pembayaran.
                        </p>
                    </div>
                    <div className="flex gap-2">
                        <Input
                            type="month"
                            value={selectedMonth}
                            onChange={(e) => setSelectedMonth(e.target.value)}
                        />
                        <Button onClick={apply}>Tampilkan</Button>
                    </div>
                </div>
                <div className="grid gap-4 sm:grid-cols-2 lg:grid-cols-5">
                    <Metric title="Sales" value={money(summary.sales)} />
                    <Metric title="Orders" value={summary.orders} />
                    <Metric title="Invoice" value={money(summary.billed)} />
                    <Metric title="Paid" value={money(summary.paid)} />
                    <Metric
                        title="Outstanding"
                        value={money(summary.outstanding)}
                    />
                </div>
                <div className="grid gap-6 lg:grid-cols-2">
                    <Card>
                        <CardHeader>
                            <CardTitle>Performance Sales</CardTitle>
                        </CardHeader>
                        <CardContent>
                            <CrmTable
                                headers={["Sales", "Order", "Penjualan"]}
                                rows={salesPerformance.map((r) => [
                                    r.sales?.name ?? "-",
                                    r.orders,
                                    money(r.sales),
                                ])}
                            />
                        </CardContent>
                    </Card>
                    <Card>
                        <CardHeader>
                            <CardTitle>Performance Visit</CardTitle>
                        </CardHeader>
                        <CardContent>
                            <CrmTable
                                headers={["Sales", "Visit", "Selesai"]}
                                rows={visitPerformance.map((r) => [
                                    r.sales?.name ?? "-",
                                    r.visits,
                                    r.completed,
                                ])}
                            />
                        </CardContent>
                    </Card>
                </div>
                <Card>
                    <CardHeader>
                        <CardTitle>Pembayaran berdasarkan Metode</CardTitle>
                    </CardHeader>
                    <CardContent>
                        <CrmTable
                            headers={["Metode", "Total"]}
                            rows={paymentByMethod.map((r) => [
                                String(r.method).toUpperCase(),
                                money(r.total),
                            ])}
                        />
                    </CardContent>
                </Card>
            </div>
        </AppLayout>
    );
}
function Metric({ title, value }: { title: string; value: string | number }) {
    return (
        <Card>
            <CardContent className="p-5">
                <p className="text-sm text-muted-foreground">{title}</p>
                <p className="mt-2 text-xl font-bold">{value}</p>
            </CardContent>
        </Card>
    );
}
function CrmTable({ headers, rows }: { headers: string[]; rows: any[][] }) {
    return (
        <div className="overflow-x-auto">
            <Table className="w-full text-sm">
                <TableHeader>
                    <TableRow className="border-b text-left">
                        {headers.map((h) => (
                            <TableHead
                                key={h}
                                className="px-3 py-3 font-medium"
                            >
                                {h}
                            </TableHead>
                        ))}
                    </TableRow>
                </TableHeader>
                <TableBody>
                    {rows.length ? (
                        rows.map((row, i) => (
                            <TableRow
                                key={i}
                                className="border-b last:border-0"
                            >
                                {row.map((cell, j) => (
                                    <TableCell key={j} className="px-3 py-3">
                                        {cell}
                                    </TableCell>
                                ))}
                            </TableRow>
                        ))
                    ) : (
                        <TableRow>
                            <TableCell
                                colSpan={headers.length}
                                className="px-3 py-6 text-center text-muted-foreground"
                            >
                                Belum ada data.
                            </TableCell>
                        </TableRow>
                    )}
                </TableBody>
            </Table>
        </div>
    );
}
