import { Head, Link, useForm } from '@inertiajs/react';
import { ArrowLeft, Save, TrendingDown, TrendingUp } from 'lucide-react';
import type { FormEvent } from 'react';

import { Button } from '@/components/ui/button';
import {
    Card,
    CardContent,
    CardDescription,
    CardHeader,
    CardTitle,
} from '@/components/ui/card';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import {
    Select,
    SelectContent,
    SelectGroup,
    SelectItem,
    SelectTrigger,
    SelectValue,
} from '@/components/ui/select';
import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs';
import { Textarea } from '@/components/ui/textarea';
import AppLayout from '@/layouts/app-layout';
import cashTransactionRoutes from '@/routes/cash-transactions';
import type { BreadcrumbItem } from '@/types';
import type { Account } from '@/types/accounting';

interface PageProps {
    expense_accounts: Account[];
    income_accounts: Account[];
    cash_accounts: Account[];
}

const breadcrumbs: BreadcrumbItem[] = [
    {
        title: 'Manajemen Kas',
        href: cashTransactionRoutes.index().url,
    },
    {
        title: 'Input Transaksi Baru',
        href: cashTransactionRoutes.create().url,
    },
];

export default function CreateCashTransaction({
    expense_accounts,
    income_accounts,
    cash_accounts,
}: PageProps) {
    const { data, setData, post, processing, errors, reset } = useForm({
        type: 'expense' as 'income' | 'expense',
        related_account_id: '',
        cash_account_id: '',
        amount: 0,
        date: new Date().toISOString().split('T')[0],
        description: '',
    });

    const isExpense = data.type === 'expense';
    const activeAccounts = isExpense ? expense_accounts : income_accounts;

    const submit = (e: FormEvent) => {
        e.preventDefault();
        post(cashTransactionRoutes.store().url, {
            onSuccess: () => reset(),
        });
    };

    return (
        <AppLayout breadcrumbs={breadcrumbs}>
            <Head title={`Input ${isExpense ? 'Pengeluaran' : 'Pemasukan'}`} />

            <div className="mx-auto flex h-full w-2/3 flex-1 flex-col gap-4 p-4 lg:max-w-3xl">
                <div className="flex items-center gap-4">
                    <Button variant="outline" size="icon" asChild>
                        <Link href={cashTransactionRoutes.index().url}>
                            <ArrowLeft className="h-4 w-4" />
                        </Link>
                    </Button>
                    <div className="flex flex-col gap-1">
                        <h1 className="text-2xl font-black">
                            Input Transaksi Kas Baru
                        </h1>
                        <span className="text-sm text-muted-foreground">
                            Isi formulir di bawah untuk Input Transaksi Kas Baru
                        </span>
                    </div>
                </div>

                <div className="flex flex-col gap-4">
                    <Card>
                        <CardHeader className="pb-4">
                            <div className="flex flex-col justify-between gap-4 md:flex-row md:items-center">
                                <div className="space-y-1">
                                    <CardTitle>Data Transaksi</CardTitle>
                                    <CardDescription>
                                        Pilih akun{' '}
                                        {isExpense ? 'beban' : 'pendapatan'} dan
                                        akun kas terkait.
                                    </CardDescription>
                                </div>
                                <Tabs
                                    value={data.type}
                                    onValueChange={(v) => {
                                        setData((prev) => ({
                                            ...prev,
                                            type: v as 'income' | 'expense',
                                            related_account_id: '', // Reset account when type switches
                                        }));
                                    }}
                                >
                                    <TabsList className="grid grid-cols-2">
                                        <TabsTrigger
                                            value="expense"
                                            className="gap-2"
                                        >
                                            <TrendingDown className="h-3.5 w-3.5 text-rose-500" />
                                            Pengeluaran
                                        </TabsTrigger>
                                        <TabsTrigger
                                            value="income"
                                            className="gap-2"
                                        >
                                            <TrendingUp className="h-3.5 w-3.5 text-emerald-500" />
                                            Pemasukan
                                        </TabsTrigger>
                                    </TabsList>
                                </Tabs>
                            </div>
                        </CardHeader>
                        <CardContent>
                            <form
                                onSubmit={submit}
                                className="flex flex-col gap-6"
                            >
                                <div className="grid gap-4 md:grid-cols-2">
                                    <div className="space-y-2">
                                        <Label htmlFor="date">
                                            Tanggal Transaksi
                                        </Label>
                                        <Input
                                            id="date"
                                            type="date"
                                            value={data.date}
                                            onChange={(e) =>
                                                setData('date', e.target.value)
                                            }
                                            required
                                        />
                                        {errors.date && (
                                            <p className="text-sm text-destructive">
                                                {errors.date}
                                            </p>
                                        )}
                                    </div>

                                    <div className="space-y-2">
                                        <Label htmlFor="amount">
                                            Nominal (Rp)
                                        </Label>
                                        <Input
                                            id="amount"
                                            type="number"
                                            placeholder={`Masukkan jumlah ${isExpense ? 'pengeluaran' : 'pemasukan'}...`}
                                            value={data.amount || ''}
                                            onChange={(e) =>
                                                setData(
                                                    'amount',
                                                    Number(e.target.value),
                                                )
                                            }
                                            required
                                        />
                                        {errors.amount && (
                                            <p className="text-sm text-destructive">
                                                {errors.amount}
                                            </p>
                                        )}
                                    </div>
                                </div>

                                <div className="space-y-2">
                                    <Label htmlFor="related_account">
                                        Akun{' '}
                                        {isExpense ? 'Beban' : 'Pendapatan'}
                                    </Label>
                                    <Select
                                        onValueChange={(v) =>
                                            setData('related_account_id', v)
                                        }
                                        value={data.related_account_id}
                                    >
                                        <SelectTrigger id="related_account">
                                            <SelectValue
                                                placeholder={`Pilih Akun ${isExpense ? 'Beban' : 'Pendapatan'}...`}
                                            />
                                        </SelectTrigger>
                                        <SelectContent>
                                            <SelectGroup>
                                                {activeAccounts.map((acc) => (
                                                    <SelectItem
                                                        key={acc.id}
                                                        value={acc.id.toString()}
                                                    >
                                                        {acc.code} - {acc.name}
                                                    </SelectItem>
                                                ))}
                                            </SelectGroup>
                                        </SelectContent>
                                    </Select>
                                    {errors.related_account_id && (
                                        <p className="text-sm text-destructive">
                                            {errors.related_account_id}
                                        </p>
                                    )}
                                </div>

                                <div className="space-y-2">
                                    <Label htmlFor="cash_account">
                                        Akun Kas{' '}
                                        {isExpense ? 'Pembayar' : 'Penerima'}
                                    </Label>
                                    <Select
                                        onValueChange={(v) =>
                                            setData('cash_account_id', v)
                                        }
                                        value={data.cash_account_id}
                                    >
                                        <SelectTrigger id="cash_account">
                                            <SelectValue placeholder="Pilih Dana dari Kas..." />
                                        </SelectTrigger>
                                        <SelectContent>
                                            <SelectGroup>
                                                {cash_accounts.map((acc) => (
                                                    <SelectItem
                                                        key={acc.id}
                                                        value={acc.id.toString()}
                                                    >
                                                        {acc.code} - {acc.name}
                                                    </SelectItem>
                                                ))}
                                            </SelectGroup>
                                        </SelectContent>
                                    </Select>
                                    {errors.cash_account_id && (
                                        <p className="text-sm text-destructive">
                                            {errors.cash_account_id}
                                        </p>
                                    )}
                                </div>

                                <div className="space-y-2">
                                    <Label htmlFor="description">
                                        Keterangan / Deskripsi
                                    </Label>
                                    <Textarea
                                        id="description"
                                        placeholder={
                                            isExpense
                                                ? 'Contoh: Pembelian minyak motor operasional BL 1234 XX...'
                                                : 'Contoh: Penerimaan bagi hasil simpanan di bank...'
                                        }
                                        className="h-24"
                                        value={data.description}
                                        onChange={(e) =>
                                            setData(
                                                'description',
                                                e.target.value,
                                            )
                                        }
                                        required
                                    />
                                    {errors.description && (
                                        <p className="text-sm text-destructive">
                                            {errors.description}
                                        </p>
                                    )}
                                </div>

                                <div className="flex justify-end pt-4">
                                    <Button
                                        type="submit"
                                        disabled={processing}
                                        className="min-w-[120px]"
                                    >
                                        {processing ? (
                                            'Menyimpan...'
                                        ) : (
                                            <>
                                                <Save className="mr-2 h-4 w-4" />
                                                Simpan Transaksi
                                            </>
                                        )}
                                    </Button>
                                </div>
                            </form>
                        </CardContent>
                    </Card>
                </div>
            </div>
        </AppLayout>
    );
}
