import { createFileRoute, Link } from "@tanstack/react-router";
import { useQuery } from "@tanstack/react-query";
import { ArrowDownLeft, ArrowUpRight, Wallet } from "lucide-react";

import { AppShell } from "@/components/AppShell";
import { DaftarTransaksi } from "@/components/DaftarTransaksi";
import { TransaksiForm } from "@/components/TransaksiForm";
import { Skeleton } from "@/components/ui/skeleton";
import { ambilTransaksi, formatRupiah, ringkasBulanIni } from "@/lib/keuangan";

export const Route = createFileRoute("/_authenticated/dashboard")({
  head: () => ({
    meta: [
      { title: "Catatan Duit — Pencatatan Keuangan Pribadi" },
      {
        name: "description",
        content:
          "Catat pemasukan, pengeluaran, dan bukti transfer dalam hitungan detik. Lihat saldo berjalan dan ringkasan bulan ini.",
      },
      { property: "og:title", content: "Catatan Duit — Pencatatan Keuangan Pribadi" },
      {
        property: "og:description",
        content: "Catat transaksi dan simpan bukti transfer, langsung terlihat di dashboard.",
      },
    ],
  }),
  component: Beranda,
});

function Beranda() {
  const { data, isLoading } = useQuery({ queryKey: ["transaksi", "operasional"], queryFn: () => ambilTransaksi("operasional") });
  const items = data ?? [];
  const ringkas = ringkasBulanIni(items);

  return (
    <AppShell>
      <h1 className="text-xl font-semibold leading-snug sm:text-2xl">
        Pencatatan duit pengeluaran dan pemasukan tanpa ribet dan akurat
      </h1>
      <ul className="mt-2 space-y-1 text-sm text-muted-foreground">
        <li className="flex items-start gap-2">
          <span className="mt-1.5 size-1.5 shrink-0 rounded-full bg-brand-blue" />
          Unggah invoice image otomatis dengan report dashboard transaksi
        </li>
      </ul>

      <section className="mt-4 rounded-3xl bg-brand-gradient p-5 text-primary-foreground shadow-sm">
        <p className="flex items-center gap-2 text-xs opacity-80">
          <Wallet className="size-4" /> Saldo berjalan
        </p>
        {isLoading ? (
          <Skeleton className="mt-2 h-9 w-48 bg-primary-foreground/20" />
        ) : (
          <p className="mt-1 text-3xl font-semibold tabular-nums">{formatRupiah(ringkas.saldo)}</p>
        )}
        <p className="mt-1 text-xs opacity-80">{ringkas.jumlah} transaksi bulan ini</p>
      </section>

      <section className="mt-4 grid grid-cols-2 gap-3">
        <KartuRingkas
          label="Pemasukan bulan ini"
          nilai={ringkas.masuk}
          icon={<ArrowDownLeft className="size-4" />}
          positif
        />
        <KartuRingkas
          label="Pengeluaran bulan ini"
          nilai={ringkas.keluar}
          icon={<ArrowUpRight className="size-4" />}
        />
      </section>

      <div className="mt-5">
        <TransaksiForm />
      </div>

      <section className="mt-6">
        <div className="mb-2 flex items-end justify-between">
          <h2 className="text-sm font-semibold">Transaksi terbaru</h2>
          <Link to="/riwayat" className="text-xs font-medium text-primary">
            Lihat semua
          </Link>
        </div>
        {isLoading ? (
          <div className="space-y-2">
            {[0, 1, 2, 3].map((i) => (
              <Skeleton key={i} className="h-16 w-full rounded-2xl" />
            ))}
          </div>
        ) : (
          <DaftarTransaksi items={items.slice(0, 6)} />
        )}
      </section>
    </AppShell>
  );
}

function KartuRingkas({
  label,
  nilai,
  icon,
  positif,
}: {
  label: string;
  nilai: number;
  icon: React.ReactNode;
  positif?: boolean;
}) {
  return (
    <div className="rounded-2xl border border-border/70 bg-card p-4">
      <p className="flex items-center gap-1.5 text-xs text-muted-foreground">
        {icon}
        {label}
      </p>
      <p
        className={`mt-1 text-lg font-semibold tabular-nums ${positif ? "text-primary" : "text-foreground"}`}
      >
        {formatRupiah(nilai)}
      </p>
    </div>
  );
}
