import { createFileRoute } from "@tanstack/react-router";
import { useQuery } from "@tanstack/react-query";
import { useMemo, useState } from "react";

import { AppShell } from "@/components/AppShell";
import { DaftarTransaksi } from "@/components/DaftarTransaksi";
import { ExportExcel } from "@/components/ExportExcel";
import { TransaksiForm } from "@/components/TransaksiForm";

import { Button } from "@/components/ui/button";
import { Skeleton } from "@/components/ui/skeleton";
import {
  Select,
  SelectContent,
  SelectItem,
  SelectTrigger,
  SelectValue,
} from "@/components/ui/select";
import { ambilTransaksi, formatRupiah, SEMUA_KATEGORI } from "@/lib/keuangan";

export const Route = createFileRoute("/_authenticated/riwayat")({
  head: () => ({
    meta: [
      { title: "Riwayat Transaksi — Catatan Duit" },
      {
        name: "description",
        content:
          "Telusuri seluruh riwayat pemasukan dan pengeluaran dengan filter periode, kategori, dan jenis transaksi.",
      },
      { property: "og:title", content: "Riwayat Transaksi — Catatan Duit" },
      {
        property: "og:description",
        content: "Filter transaksi berdasarkan periode, kategori, dan jenis.",
      },
    ],
  }),
  component: Riwayat,
});

type Periode = "7" | "30" | "bulan-ini" | "semua";

function Riwayat() {
  const { data, isLoading } = useQuery({ queryKey: ["transaksi", "operasional"], queryFn: () => ambilTransaksi("operasional") });
  const [periode, setPeriode] = useState<Periode>("30");
  const [kategori, setKategori] = useState("semua");
  const [jenis, setJenis] = useState("semua");

  const items = useMemo(() => {
    const semua = data ?? [];
    const now = new Date();
    return semua.filter((t) => {
      if (jenis !== "semua" && t.jenis !== jenis) return false;
      if (kategori !== "semua" && t.kategori !== kategori) return false;
      const tgl = new Date(t.tanggal + "T00:00:00");
      if (periode === "bulan-ini") {
        return tgl.getMonth() === now.getMonth() && tgl.getFullYear() === now.getFullYear();
      }
      if (periode === "7" || periode === "30") {
        const batas = new Date(now);
        batas.setDate(batas.getDate() - Number(periode));
        return tgl >= batas;
      }
      return true;
    });
  }, [data, periode, kategori, jenis]);

  const total = items.reduce(
    (a, t) => a + (t.jenis === "pemasukan" ? Number(t.nominal) : -Number(t.nominal)),
    0,
  );

  return (
    <AppShell>
      <div className="flex items-center justify-between gap-2">
        <h1 className="text-lg font-semibold">Riwayat transaksi</h1>
        <div className="flex items-center gap-2">
          <ExportExcel items={data ?? []} />
          <TransaksiForm
            trigger={
              <Button size="sm" variant="secondary">
                Tambah
              </Button>
            }
          />
        </div>
      </div>


      <div className="mt-4 grid grid-cols-3 gap-2">
        <Select value={periode} onValueChange={(v) => setPeriode(v as Periode)}>
          <SelectTrigger>
            <SelectValue />
          </SelectTrigger>
          <SelectContent>
            <SelectItem value="7">7 hari</SelectItem>
            <SelectItem value="30">30 hari</SelectItem>
            <SelectItem value="bulan-ini">Bulan ini</SelectItem>
            <SelectItem value="semua">Semua</SelectItem>
          </SelectContent>
        </Select>
        <Select value={jenis} onValueChange={setJenis}>
          <SelectTrigger>
            <SelectValue />
          </SelectTrigger>
          <SelectContent>
            <SelectItem value="semua">Semua jenis</SelectItem>
            <SelectItem value="pemasukan">Pemasukan</SelectItem>
            <SelectItem value="pengeluaran">Pengeluaran</SelectItem>
          </SelectContent>
        </Select>
        <Select value={kategori} onValueChange={setKategori}>
          <SelectTrigger>
            <SelectValue />
          </SelectTrigger>
          <SelectContent>
            <SelectItem value="semua">Semua kategori</SelectItem>
            {SEMUA_KATEGORI.map((k) => (
              <SelectItem key={k} value={k}>
                {k}
              </SelectItem>
            ))}
          </SelectContent>
        </Select>
      </div>

      <div className="mt-4 flex items-center justify-between rounded-2xl border border-border/70 bg-card px-4 py-3 text-sm">
        <span className="text-muted-foreground">{items.length} transaksi</span>
        <span className="font-semibold tabular-nums">Selisih {formatRupiah(total)}</span>
      </div>

      <div className="mt-4">
        {isLoading ? (
          <div className="space-y-2">
            {[0, 1, 2, 3, 4].map((i) => (
              <Skeleton key={i} className="h-16 w-full rounded-2xl" />
            ))}
          </div>
        ) : (
          <DaftarTransaksi items={items} />
        )}
      </div>
    </AppShell>
  );
}
