import { Head, Link } from '@inertiajs/react';
import type { ColumnDef } from '@tanstack/react-table';
import { ArrowLeft, Edit, History } from 'lucide-react';

import { Button } from '@/components/ui/button';
import {
    Card,
    CardContent,
    CardDescription,
    CardHeader,
    CardTitle,
} from '@/components/ui/card';
import { DataTable } from '@/components/ui/data-table';
import { StatusBadge } from '@/components/ui/status-badge';
import AppLayout from '@/layouts/app-layout';
import { formatDateID, formatIDR } from '@/lib/formatters';
import accountingRoutes from '@/routes/accounting';
import type { BreadcrumbItem } from '@/types';
import type { Account, JournalEntryLine } from '@/types/accounting';

interface PageProps {
    account: Account;
    debit_total: number;
    credit_total: number;
    balance: number;
}

export default function ShowAccount({
    account,
    debit_total,
    credit_total,
    balance,
}: PageProps) {
    const breadcrumbs: BreadcrumbItem[] = [
        {
            title: 'Akuntansi',
            href: accountingRoutes.accounts.index().url,
        },
        {
            title: 'Daftar Akun',
            href: accountingRoutes.accounts.index().url,
        },
        {
            title: account.name,
            href: accountingRoutes.accounts.show({ account: account.id }).url,
        },
    ];

    const columns: ColumnDef<JournalEntryLine>[] = [
        {
            accessorKey: 'journal_entry.transaction_date',
            header: 'Tanggal',
            cell: ({ row }) =>
                formatDateID(
                    row.original.journal_entry?.transaction_date || '',
                ),
        },
        {
            accessorKey: 'journal_entry.voucher_number',
            header: 'Voucher',
            cell: ({ row }) => (
                <Link
                    href={
                        accountingRoutes.journal.show({
                            entry: row.original.journal_entry_id,
                        }).url
                    }
                    className="font-mono text-primary hover:underline"
                >
                    {row.original.journal_entry?.voucher_number}
                </Link>
            ),
        },
        {
            accessorKey: 'description',
            header: 'Keterangan',
        },
        {
            accessorKey: 'type',
            header: 'Tipe',
            cell: ({ row }) => (
                <span className="capitalize">{row.getValue('type')}</span>
            ),
        },
        {
            accessorKey: 'amount',
            header: 'Jumlah',
            cell: ({ row }) => formatIDR(row.getValue('amount')),
        },
    ];

    return (
        <AppLayout breadcrumbs={breadcrumbs}>
            <Head title={`Detail Akun - ${account.name}`} />

            <div className="flex h-full flex-1 flex-col gap-4 p-4">
                <div className="flex items-center justify-between">
                    <div className="flex items-center gap-4">
                        <Button variant="outline" size="icon" asChild>
                            <Link href={accountingRoutes.accounts.index().url}>
                                <ArrowLeft className="h-4 w-4" />
                            </Link>
                        </Button>
                        <div className="flex flex-col gap-1">
                            <h1 className="text-2xl font-black">
                                {account.name}
                            </h1>
                            <p className="font-mono text-sm text-muted-foreground">
                                {account.code} • {account.classification}
                            </p>
                        </div>
                    </div>
                    <Button variant="outline" asChild>
                        <Link
                            href={
                                accountingRoutes.accounts.edit({
                                    account: account.id,
                                }).url
                            }
                        >
                            <Edit className="mr-2 h-4 w-4" />
                            Edit Akun
                        </Link>
                    </Button>
                </div>

                <div className="grid gap-4 md:grid-cols-4">
                    <Card>
                        <CardHeader className="pb-2">
                            <CardTitle className="text-sm font-medium">
                                Klasifikasi
                            </CardTitle>
                        </CardHeader>
                        <CardContent>
                            <div className="text-2xl font-bold capitalize">
                                {account.classification}
                            </div>
                        </CardContent>
                    </Card>
                    <Card>
                        <CardHeader className="pb-2">
                            <CardTitle className="text-sm font-medium">
                                Level
                            </CardTitle>
                        </CardHeader>
                        <CardContent>
                            <div className="text-2xl font-bold">
                                Lvl {account.level}
                            </div>
                        </CardContent>
                    </Card>
                    <Card>
                        <CardHeader className="pb-2">
                            <CardTitle className="text-sm font-medium">
                                Saldo Normal
                            </CardTitle>
                        </CardHeader>
                        <CardContent>
                            <div className="text-2xl font-bold capitalize">
                                {account.normal_balance}
                            </div>
                        </CardContent>
                    </Card>
                    <Card>
                        <CardHeader className="pb-2">
                            <CardTitle className="text-sm font-medium">
                                Status
                            </CardTitle>
                        </CardHeader>
                        <CardContent>
                            <StatusBadge
                                type="default"
                                status={
                                    account.is_active ? 'active' : 'inactive'
                                }
                            />
                        </CardContent>
                    </Card>
                </div>

                <div className="grid gap-4 md:grid-cols-3">
                    <Card className="md:col-span-1">
                        <CardHeader>
                            <CardTitle>Ringkasan Saldo</CardTitle>
                            <CardDescription>
                                Posisi keuangan akun saat ini.
                            </CardDescription>
                        </CardHeader>
                        <CardContent className="space-y-4">
                            <div className="flex justify-between border-b pb-2">
                                <span className="text-muted-foreground">
                                    Total Debit
                                </span>
                                <span className="font-medium text-blue-600">
                                    {formatIDR(debit_total)}
                                </span>
                            </div>
                            <div className="flex justify-between border-b pb-2">
                                <span className="text-muted-foreground">
                                    Total Kredit
                                </span>
                                <span className="font-medium text-red-600">
                                    {formatIDR(credit_total)}
                                </span>
                            </div>
                            <div className="flex justify-between pt-2">
                                <span className="text-lg font-bold">
                                    Saldo Akhir
                                </span>
                                <span className="text-lg font-bold text-primary">
                                    {formatIDR(balance)}
                                </span>
                            </div>
                        </CardContent>
                    </Card>

                    <Card className="md:col-span-2">
                        <CardHeader>
                            <div className="flex items-center justify-between">
                                <div className="space-y-1">
                                    <CardTitle>Transaksi Terakhir</CardTitle>
                                    <CardDescription>
                                        10 transaksi terbaru pada akun ini.
                                    </CardDescription>
                                </div>
                                <History className="h-5 w-5 text-muted-foreground" />
                            </div>
                        </CardHeader>
                        <CardContent>
                            <DataTable
                                columns={columns}
                                data={account.journal_entry_lines ?? []}
                            />
                        </CardContent>
                    </Card>
                </div>
            </div>
        </AppLayout>
    );
}
