import { Head } from '@inertiajs/react';
import { Download, Printer, SearchIcon } from 'lucide-react';
import { useMemo, useState } from 'react';

import { Button } from '@/components/ui/button';
import { Card, CardContent } from '@/components/ui/card';
import {
    DropdownMenu,
    DropdownMenuContent,
    DropdownMenuItem,
    DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import {
    Table,
    TableBody,
    TableCell,
    TableFooter,
    TableHead,
    TableHeader,
    TableRow,
} from '@/components/ui/table';
import AppLayout from '@/layouts/app-layout';
import { formatIDR } from '@/lib/formatters';
import { useFilterParams } from '@/lib/hooks/useFilterParams';
import accountingRoutes from '@/routes/accounting';
import type { BreadcrumbItem } from '@/types';

interface TrialBalanceAccount {
    code: string;
    name: string;
    classification: string;
    normal_balance: string;
    debit: number;
    credit: number;
}

interface PageProps {
    accounts: TrialBalanceAccount[];
    total_debit: number;
    total_credit: number;
    as_of_date: string;
}

const breadcrumbs: BreadcrumbItem[] = [
    {
        title: 'Akuntansi',
        href: accountingRoutes.accounts.index().url,
    },
    {
        title: 'Laporan Keuangan',
        href: '#',
    },
    {
        title: 'Neraca Saldo',
        href: accountingRoutes.reports.trialBalance().url,
    },
];

export default function TrialBalance({
    accounts,
    total_debit,
    total_credit,
    as_of_date,
}: PageProps) {
    const [search, setSearch] = useState('');

    const filteredAccounts = useMemo(
        () =>
            accounts.filter(
                (acc) =>
                    acc.name.toLowerCase().includes(search.toLowerCase()) ||
                    acc.code.toLowerCase().includes(search.toLowerCase()),
            ),
        [accounts, search],
    );

    const { updateFilter } = useFilterParams({
        baseUrl: accountingRoutes.reports.trialBalance().url,
    });

    const handleDateChange = (date: string) => {
        updateFilter('as_of_date', date);
    };

    return (
        <AppLayout breadcrumbs={breadcrumbs}>
            <Head title="Neraca Saldo" />

            <div className="flex h-full flex-1 flex-col gap-4 p-4">
                <div className="flex flex-col gap-4 md:flex-row md:items-center md:justify-between">
                    <div className="flex flex-col gap-1">
                        <h1 className="text-2xl font-black">
                            Neraca Saldo (Trial Balance)
                        </h1>
                        <p className="text-sm text-muted-foreground">
                            Posisi saldo semua akun buku besar pada tanggal
                            tertentu.
                        </p>
                    </div>
                    <div className="flex gap-2">
                        <DropdownMenu>
                            <DropdownMenuTrigger asChild>
                                <Button variant="outline" size="sm">
                                    <Download className="mr-2 h-4 w-4" />
                                    Export
                                </Button>
                            </DropdownMenuTrigger>
                            <DropdownMenuContent align="end">
                                <DropdownMenuItem asChild>
                                    <a
                                        href={
                                            accountingRoutes.reports.trialBalance.export(
                                                {
                                                    query: {
                                                        as_of_date:
                                                            as_of_date.split(
                                                                'T',
                                                            )[0],
                                                        format: 'pdf',
                                                    },
                                                },
                                            ).url
                                        }
                                        target="_blank"
                                        rel="noopener noreferrer"
                                        className="w-full cursor-pointer"
                                    >
                                        Export PDF
                                    </a>
                                </DropdownMenuItem>
                                <DropdownMenuItem asChild>
                                    <a
                                        href={
                                            accountingRoutes.reports.trialBalance.export(
                                                {
                                                    query: {
                                                        as_of_date:
                                                            as_of_date.split(
                                                                'T',
                                                            )[0],
                                                        format: 'csv',
                                                    },
                                                },
                                            ).url
                                        }
                                        className="w-full cursor-pointer"
                                    >
                                        Export CSV
                                    </a>
                                </DropdownMenuItem>
                            </DropdownMenuContent>
                        </DropdownMenu>
                        <Button
                            variant="outline"
                            size="sm"
                            onClick={() => window.print()}
                        >
                            <Printer className="mr-2 h-4 w-4" />
                            Cetak
                        </Button>
                    </div>
                </div>
                <div className="flex flex-row justify-between">
                    <div className="flex items-center gap-2">
                        <div className="relative">
                            <SearchIcon className="absolute top-2.5 left-2.5 h-4 w-4 text-muted-foreground" />
                            <Input
                                placeholder="Cari akun..."
                                className="w-62.5 pl-8"
                                value={search}
                                onChange={(e) => setSearch(e.target.value)}
                            />
                        </div>
                    </div>
                    <div className="flex items-center gap-2">
                        <Label
                            htmlFor="as_of_date"
                            className="text-sm whitespace-nowrap"
                        >
                            Per Tanggal:
                        </Label>
                        <Input
                            id="as_of_date"
                            type="date"
                            className="w-40"
                            value={as_of_date.split('T')[0]} // Handle potential datetime string
                            onChange={(e) => handleDateChange(e.target.value)}
                        />
                    </div>
                </div>
                <Card>
                    {/* <CardHeader className="pb-4"></CardHeader> */}
                    <CardContent className="rounded-md border p-0">
                        <Table>
                            <TableHeader>
                                <TableRow>
                                    <TableHead className="w-37.5">
                                        Kode Akun
                                    </TableHead>
                                    <TableHead>Nama Akun</TableHead>
                                    <TableHead className="text-right">
                                        Debit
                                    </TableHead>
                                    <TableHead className="text-right">
                                        Kredit
                                    </TableHead>
                                </TableRow>
                            </TableHeader>
                            <TableBody>
                                {filteredAccounts.length > 0 ? (
                                    filteredAccounts.map(
                                        (account: TrialBalanceAccount) => (
                                            <TableRow key={account.code}>
                                                <TableCell className="font-mono text-xs">
                                                    {account.code}
                                                </TableCell>
                                                <TableCell className="font-medium">
                                                    {account.name}
                                                </TableCell>
                                                <TableCell className="text-right">
                                                    {account.debit > 0
                                                        ? formatIDR(
                                                              account.debit,
                                                          )
                                                        : '-'}
                                                </TableCell>
                                                <TableCell className="pr-4 text-right">
                                                    {account.credit > 0
                                                        ? formatIDR(
                                                              account.credit,
                                                          )
                                                        : '-'}
                                                </TableCell>
                                            </TableRow>
                                        ),
                                    )
                                ) : (
                                    <TableRow>
                                        <TableCell
                                            colSpan={4}
                                            className="h-24 text-center"
                                        >
                                            Tidak ada data ditemukan.
                                        </TableCell>
                                    </TableRow>
                                )}
                            </TableBody>
                            <TableFooter>
                                <TableRow className="bg-muted/50 font-bold">
                                    <TableCell
                                        colSpan={2}
                                        className="text-center text-base tracking-wider uppercase"
                                    >
                                        Total
                                    </TableCell>
                                    <TableCell className="text-right text-base text-blue-600">
                                        {formatIDR(total_debit)}
                                    </TableCell>
                                    <TableCell className="text-right text-base text-red-600">
                                        {formatIDR(total_credit)}
                                    </TableCell>
                                </TableRow>
                                {Math.abs(total_debit - total_credit) >
                                    0.01 && (
                                    <TableRow className="bg-destructive/10 text-destructive">
                                        <TableCell
                                            colSpan={2}
                                            className="text-right font-bold italic"
                                        >
                                            Balance Difference:
                                        </TableCell>
                                        <TableCell
                                            colSpan={2}
                                            className="text-center font-bold"
                                        >
                                            {formatIDR(
                                                Math.abs(
                                                    total_debit - total_credit,
                                                ),
                                            )}
                                        </TableCell>
                                    </TableRow>
                                )}
                            </TableFooter>
                        </Table>
                    </CardContent>
                </Card>
            </div>
        </AppLayout>
    );
}
