import { Head, router } from '@inertiajs/react';
import { Button } from '@ui/components/ui/button';
import { Card, CardContent, CardHeader, CardTitle } from '@ui/components/ui/card';
import { Input } from '@ui/components/ui/input';
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@ui/components/ui/select';
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@ui/components/ui/table';
import { Download, Search } from 'lucide-react';
import { useMemo, useState } from 'react';
import { FinanceAppLayout } from '@/layouts/finance-app-layout';
import { useAppText } from '@/lib/app-text';

interface ReportColumn {
    key: string;
    company_name: string;
    department_name: string;
    branch_name: string;
}

interface ReportRow {
    coa_id: number;
    account_number: string;
    description: string;
    values: Record<string, number>;
    total_remaining: number;
}

interface ReportingIndexProps {
    reportData: {
        columns: ReportColumn[];
        rows: ReportRow[];
    };
    filters: {
        year: number;
    };
}

export default function BudgetVarianceReport({ reportData, filters }: ReportingIndexProps) {
    const { t } = useAppText();
    const [selectedYear, setSelectedYear] = useState(filters.year.toString());
    const [searchQuery, setSearchQuery] = useState('');

    const handleYearChange = (value: string) => {
        setSelectedYear(value);
        router.get(
            '/department/finance/reporting/budget-variance',
            { year: value },
            { preserveState: true }
        );
    };

    const formatCurrency = (value: number) => {
        return new Intl.NumberFormat('id-ID').format(value);
    };

    // Calculate Totals per Column
    const columnTotals = useMemo(() => {
        const totals: Record<string, number> = {};
        reportData.columns.forEach(col => {
            totals[col.key] = reportData.rows.reduce((sum, row) => sum + (row.values[col.key] || 0), 0);
        });

        return totals;
    }, [reportData]);

    // Group columns by Company -> Department (preserving order)
    const companyGroups = useMemo(() => {
        const groups: Array<{
            name: string;
            departments: Array<{
                name: string;
                columns: ReportColumn[];
            }>;
        }> = [];

        reportData.columns.forEach(col => {
            let company = groups.find(g => g.name === col.company_name);

            if (!company) {
                company = { name: col.company_name, departments: [] };
                groups.push(company);
            }

            let dept = company.departments.find(d => d.name === col.department_name);

            if (!dept) {
                dept = { name: col.department_name, columns: [] };
                company.departments.push(dept);
            }

            dept.columns.push(col);
        });

        return groups;
    }, [reportData.columns]);

    const filteredRows = useMemo(() => {
        if (!searchQuery) {
return reportData.rows;
}

        return reportData.rows.filter(row =>
            row.account_number.toLowerCase().includes(searchQuery.toLowerCase()) ||
            row.description.toLowerCase().includes(searchQuery.toLowerCase())
        );
    }, [reportData.rows, searchQuery]);

    const exportToExcel = () => {
        // Implement simple client-side CSV export or request server-side
        console.log("Exporting...");
        // Placeholder
    };

    return (
        <FinanceAppLayout>
            <Head title={t('reporting.budget_variance_page_title')} />

            <div className="flex h-full flex-1 flex-col gap-4 p-4">
                <div className="flex items-center justify-between">
                    <div>
                        <h1 className="text-2xl font-bold tracking-tight text-foreground">{t('reporting.budget_variance_title')}</h1>
                        <p className="text-muted-foreground">
                        {t('reporting.budget_variance_subtitle', { year: filters.year })}
                    </p>
                    </div>
                    <div className="flex flex-wrap items-center gap-3">
                        <span className="text-sm font-medium text-muted-foreground">{t('reporting.label_year')}</span>
                        <Select value={selectedYear} onValueChange={handleYearChange}>
                            <SelectTrigger className="h-9 w-[140px] text-foreground">
                                <SelectValue placeholder={t('reporting.label_year')} />
                            </SelectTrigger>
                            <SelectContent>
                                {[2024, 2025, 2026, 2027].map(year => (
                                    <SelectItem key={year} value={year.toString()}>{year}</SelectItem>
                                ))}
                            </SelectContent>
                        </Select>
                        <Button variant="outline" onClick={exportToExcel}>
                            <Download className="mr-2 h-4 w-4" />
                            {t('reporting.btn_export')}
                        </Button>
                    </div>
                </div>

                <Card className="flex flex-1 flex-col overflow-hidden">
                        <CardHeader className="flex flex-row items-center justify-between border-b px-0 py-4">
                            <CardTitle className="text-lg font-semibold text-foreground">{t('reporting.budget_variance_card_title')}</CardTitle>
                            <div className="relative w-72">
                                <Search className="absolute left-3 top-3 h-4 w-4 text-muted-foreground" />
                                <Input
                                    placeholder={t('reporting.placeholder_search')}
                                    value={searchQuery}
                                    onChange={(e) => setSearchQuery(e.target.value)}
                                    className="h-11 rounded-2xl pl-10 text-sm"
                                />
                            </div>
                        </CardHeader>
                        <CardContent className="flex-1 overflow-auto p-0">
                            <div className="relative w-full">
                                <Table>
                                <TableHeader className="sticky top-0 bg-secondary z-10 shadow-sm">
                                    {/* Company Headers */}
                                    <TableRow className="bg-primary hover:bg-primary border-b-0">
                                        <TableHead rowSpan={3} className="w-[150px] text-primary-foreground font-bold border-r border-primary-foreground/20">{t('reporting.col_account_number')}</TableHead>
                                        <TableHead rowSpan={3} className="w-[300px] text-primary-foreground font-bold border-r border-primary-foreground/20 text-center">{t('reporting.col_description')}</TableHead>

                                        {companyGroups.map((company) => {
                                            const totalCols = company.departments.reduce((sum, dept) => sum + dept.columns.length, 0);

                                            return (
                                                <TableHead
                                                    key={company.name}
                                                    colSpan={totalCols}
                                                    className="text-center text-primary-foreground font-extrabold border-r border-primary-foreground/20 border-b border-primary-foreground/20 py-2"
                                                >
                                                    {company.name.toUpperCase()}
                                                </TableHead>
                                            )
                                        })}
                                    </TableRow>

                                    {/* Department Headers */}
                                    <TableRow className="bg-primary/95 hover:bg-primary/95 border-b-0">
                                        {companyGroups.map((company) => (
                                            company.departments.map((dept) => (
                                                <TableHead
                                                    key={`${company.name}-${dept.name}`}
                                                    colSpan={dept.columns.length}
                                                    className="text-center text-primary-foreground font-bold border-r border-primary-foreground/20 border-b border-primary-foreground/20 py-1 text-xs"
                                                >
                                                    {dept.name.toUpperCase()}
                                                </TableHead>
                                            ))
                                        ))}
                                    </TableRow>

                                    {/* Branch Headers */}
                                    <TableRow className="bg-primary/90 hover:bg-primary/90">
                                        {companyGroups.map((company) => (
                                            company.departments.map((dept) => (
                                                dept.columns.map(col => (
                                                    <TableHead
                                                        key={col.key}
                                                        className="min-w-[120px] text-right text-primary-foreground font-medium border-r border-primary-foreground/10 text-[10px] py-1 h-auto"
                                                    >
                                                        {col.branch_name.toUpperCase()}
                                                    </TableHead>
                                                ))
                                            ))
                                        ))}
                                    </TableRow>
                                </TableHeader>
                                <TableBody>
                                    {filteredRows.length === 0 ? (
                                        <TableRow>
                                            <TableCell colSpan={2 + reportData.columns.length} className="text-center h-24 text-muted-foreground">
                                                {t('reporting.empty_message')}
                                            </TableCell>
                                        </TableRow>
                                    ) : (
                                        filteredRows.map((row, index) => (
                                            <TableRow key={row.coa_id} className={index % 2 === 0 ? 'bg-background' : 'bg-muted/30'}>
                                                <TableCell className="font-mono text-xs font-medium border-r">{row.account_number}</TableCell>
                                                <TableCell className="font-medium text-xs border-r truncate max-w-[300px]" title={row.description}>
                                                    {row.description}
                                                </TableCell>

                                                {/* Values cells */}
                                                {reportData.columns.map(col => {
                                                    const val = row.values[col.key] || 0;

                                                    return (
                                                        <TableCell key={col.key} className="text-right text-xs font-mono border-r">
                                                            {val !== 0 ? formatCurrency(val) : '-'}
                                                        </TableCell>
                                                    );
                                                })}
                                            </TableRow>
                                        ))
                                    )}

                                    {/* Footer Row (Totals) */}
                                    {filteredRows.length > 0 && (
                                        <TableRow className="bg-muted font-bold border-t-2">
                                            <TableCell colSpan={2} className="text-right border-r">{t('reporting.row_total')}</TableCell>
                                            {reportData.columns.map(col => (
                                                <TableCell key={col.key} className="text-right text-xs font-mono border-r">
                                                    {formatCurrency(columnTotals[col.key] || 0)}
                                                </TableCell>
                                            ))}
                                        </TableRow>
                                    )}
                                </TableBody>
                                </Table>
                            </div>
                        </CardContent>
                </Card>
            </div>
        </FinanceAppLayout>
    );
}
