/**
 * 編輯生產工單頁面
 * 僅限草稿狀態可編輯
 */

import { useState, useEffect } from "react";
import { Trash2, Plus, ArrowLeft, Save, Factory } from "lucide-react";
import { Button } from "@/Components/ui/button";
import { formatQuantity } from "@/lib/utils";
import AuthenticatedLayout from "@/Layouts/AuthenticatedLayout";
import { router, useForm, Head, Link } from "@inertiajs/react";
import toast, { Toaster } from 'react-hot-toast';
import { getBreadcrumbs } from "@/utils/breadcrumb";
import { SearchableSelect } from "@/Components/ui/searchable-select";
import { Input } from "@/Components/ui/input";
import { Label } from "@/Components/ui/label";
import { Textarea } from "@/Components/ui/textarea";
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/Components/ui/table";

interface Product {
    id: number;
    name: string;
    code: string;
    base_unit?: { id: number; name: string } | null;
}

interface Warehouse {
    id: number;
    name: string;
}

interface Unit {
    id: number;
    name: string;
}

interface InventoryOption {
    id: number;
    product_id: number;
    product_name: string;
    product_code: string;
    warehouse_id: number;
    warehouse_name: string;
    batch_number: string;
    box_number: string | null;
    quantity: number;
    arrival_date: string | null;
    expiry_date: string | null;
    unit_name: string | null;
    base_unit_id?: number;
    base_unit_name?: string;
    large_unit_id?: number;
    large_unit_name?: string;
    conversion_rate?: number;
}

interface BomItem {
    // 後端必填
    inventory_id: string;
    quantity_used: string;
    unit_id: string;

    // UI 狀態
    ui_warehouse_id: string; // 來源倉庫
    ui_product_id: string;
    ui_input_quantity: string;
    ui_selected_unit: 'base' | 'large';

    // UI 輔助 / 快取
    ui_product_name?: string;
    ui_batch_number?: string;
    ui_available_qty?: number;
    ui_expiry_date?: string;
    ui_conversion_rate?: number;
    ui_base_unit_name?: string;
    ui_large_unit_name?: string;
    ui_base_unit_id?: number;
    ui_large_unit_id?: number;
    ui_product_code?: string;
}

interface ProductionOrderItem {
    id: number;
    production_order_id: number;
    inventory_id: number;
    quantity_used: number;
    unit_id: number | null;
    inventory?: {
        product_id: number;
        product?: {
            name: string;
            code: string;
            base_unit?: { name: string };
        };
        batch_number: string;
        quantity: number;
        expiry_date?: string;
        warehouse_id?: number;
    };
    unit?: {
        name: string;
    };
}

interface ProductionOrder {
    id: number;
    code: string;
    product_id: number;
    warehouse_id: number | null;
    output_quantity: number;
    remark: string | null;
    status: string;
    items: ProductionOrderItem[];
    product?: Product;
    warehouse?: Warehouse;
}

interface Props {
    productionOrder: ProductionOrder;
    products: Product[];
    warehouses: Warehouse[];
    units: Unit[];
}

export default function ProductionEdit({ productionOrder, products, warehouses }: Props) {
    const [selectedWarehouse, setSelectedWarehouse] = useState<string>(
        productionOrder.warehouse_id ? String(productionOrder.warehouse_id) : ""
    ); // 預計入庫倉庫

    // 快取對照表：product_id -> inventories
    const [productInventoryMap, setProductInventoryMap] = useState<Record<string, InventoryOption[]>>({});
    const [loadingProducts, setLoadingProducts] = useState<Record<string, boolean>>({});

    // 獲取商品所有倉庫庫存的分佈
    const fetchProductInventories = async (productId: string) => {
        if (!productId) return;
        if (loadingProducts[productId]) return;

        setLoadingProducts(prev => ({ ...prev, [productId]: true }));
        try {
            const res = await fetch(route('api.production.products.inventories', productId));
            const data = await res.json();
            setProductInventoryMap(prev => ({ ...prev, [productId]: data }));
        } catch (e) {
            console.error(e);
        } finally {
            setLoadingProducts(prev => ({ ...prev, [productId]: false }));
        }
    };

    // 初始化 BOM items
    const initialBomItems: BomItem[] = productionOrder.items.map(item => ({
        inventory_id: String(item.inventory_id),
        quantity_used: String(item.quantity_used),
        unit_id: item.unit_id ? String(item.unit_id) : "",

        // UI Initial State (復原)
        ui_warehouse_id: item.inventory?.warehouse_id ? String(item.inventory.warehouse_id) : "",
        ui_product_id: item.inventory ? String(item.inventory.product_id) : "",
        ui_input_quantity: formatQuantity(item.quantity_used),
        ui_selected_unit: 'base',

        // UI 輔助
        ui_product_name: item.inventory?.product?.name,
        ui_batch_number: item.inventory?.batch_number,
        ui_available_qty: item.inventory?.quantity,
        ui_expiry_date: item.inventory?.expiry_date,
    }));
    const [bomItems, setBomItems] = useState<BomItem[]>(initialBomItems);

    const { data, setData, processing, errors } = useForm({
        product_id: String(productionOrder.product_id),
        warehouse_id: productionOrder.warehouse_id ? String(productionOrder.warehouse_id) : "",
        output_quantity: productionOrder.output_quantity ? formatQuantity(productionOrder.output_quantity) : "",
        remark: productionOrder.remark || "",
        items: [] as { inventory_id: number; quantity_used: number; unit_id: number | null }[],
    });

    // 初始化載入既有 BOM 的商品庫存資料
    useEffect(() => {
        initialBomItems.forEach(item => {
            if (item.ui_product_id) {
                fetchProductInventories(item.ui_product_id);
            }
        });
    }, []);

    // 當 inventoryOptions 載入後，更新現有 BOM items 的詳細資訊
    useEffect(() => {
        setBomItems(prevItems => prevItems.map(item => {
            const currentOptions = productInventoryMap[item.ui_product_id] || [];
            if (currentOptions.length > 0 && item.inventory_id && !item.ui_conversion_rate) {
                const inv = currentOptions.find(i => String(i.id) === item.inventory_id);
                if (inv) {
                    return {
                        ...item,
                        ui_warehouse_id: String(inv.warehouse_id),
                        ui_product_name: inv.product_name,
                        ui_batch_number: inv.batch_number,
                        ui_available_qty: inv.quantity,
                        ui_expiry_date: inv.expiry_date || '',
                        ui_base_unit_name: inv.base_unit_name || inv.unit_name || '',
                        ui_large_unit_name: inv.large_unit_name || '',
                        ui_base_unit_id: inv.base_unit_id,
                        ui_large_unit_id: inv.large_unit_id,
                        ui_conversion_rate: inv.conversion_rate || 1,
                    };
                }
            }
            return item;
        }));
    }, [productInventoryMap]);

    // 同步 warehouse_id 到 form data
    useEffect(() => {
        setData('warehouse_id', selectedWarehouse);
    }, [selectedWarehouse]);

    // 新增 BOM 項目
    const addBomItem = () => {
        setBomItems([...bomItems, {
            inventory_id: "",
            quantity_used: "",
            unit_id: "",
            ui_warehouse_id: "",
            ui_product_id: "",
            ui_input_quantity: "",
            ui_selected_unit: 'base',
        }]);
    };

    // 移除 BOM 項目
    const removeBomItem = (index: number) => {
        setBomItems(bomItems.filter((_, i) => i !== index));
    };

    // 更新 BOM 項目邏輯
    const updateBomItem = (index: number, field: keyof BomItem, value: any) => {
        const updated = [...bomItems];
        const item = { ...updated[index], [field]: value };

        // 0. 當選擇商品變更時
        if (field === 'ui_product_id') {
            item.ui_warehouse_id = "";
            item.inventory_id = "";
            item.quantity_used = "";
            item.unit_id = "";
            item.ui_input_quantity = "";
            item.ui_selected_unit = "base";
            if (value) {
                const prod = products.find(p => String(p.id) === value);
                if (prod) {
                    item.ui_product_name = prod.name;
                    item.ui_base_unit_name = prod.base_unit?.name || '';
                }
                fetchProductInventories(value);
            }
        }

        // 1. 當選擇來源倉庫變更時
        if (field === 'ui_warehouse_id') {
            item.inventory_id = "";
        }

        // 2. 當選擇批號 (Inventory) 變更時
        if (field === 'inventory_id' && value) {
            const currentOptions = productInventoryMap[item.ui_product_id] || [];
            const inv = currentOptions.find(i => String(i.id) === value);
            if (inv) {
                item.ui_warehouse_id = String(inv.warehouse_id);
                item.ui_product_name = inv.product_name;
                item.ui_batch_number = inv.batch_number;
                item.ui_available_qty = inv.quantity;
                item.ui_expiry_date = inv.expiry_date || '';

                item.ui_base_unit_name = inv.base_unit_name || inv.unit_name || '';
                item.ui_large_unit_name = inv.large_unit_name || '';
                item.ui_base_unit_id = inv.base_unit_id;
                item.ui_large_unit_id = inv.large_unit_id;
                item.ui_conversion_rate = inv.conversion_rate || 1;

                item.ui_selected_unit = 'base';
                item.unit_id = String(inv.base_unit_id || '');

                if (!item.ui_input_quantity) {
                    item.ui_input_quantity = String(inv.quantity);
                }
            }
        }

        // 3. 計算最終數量
        if (field === 'ui_input_quantity' || field === 'ui_selected_unit' || field === 'inventory_id') {
            const inputQty = parseFloat(item.ui_input_quantity || '0');
            const rate = item.ui_conversion_rate || 1;

            if (item.ui_selected_unit === 'large') {
                item.quantity_used = String(inputQty * rate);
                item.unit_id = String(item.ui_base_unit_id || '');
            } else {
                item.quantity_used = String(inputQty);
                item.unit_id = String(item.ui_base_unit_id || '');
            }
        }

        updated[index] = item;
        setBomItems(updated);
    };

    // 同步 BOM items 到表單 data
    useEffect(() => {
        setData('items', bomItems.map(item => ({
            inventory_id: Number(item.inventory_id),
            quantity_used: Number(item.quantity_used),
            unit_id: item.unit_id ? Number(item.unit_id) : null
        })));
    }, [bomItems]);

    // 提交表單
    const submit = (status: 'draft' | 'completed') => {
        if (status === 'completed') {
            const missingFields = [];
            if (!data.product_id) missingFields.push('成品商品');
            if (!data.output_quantity) missingFields.push('生產數量');
            if (!selectedWarehouse) missingFields.push('預計入庫倉庫');
            if (bomItems.length === 0) missingFields.push('原物料明細');

            if (missingFields.length > 0) {
                toast.error(
                    <div className="flex flex-col gap-1">
                        <span className="font-bold">請填寫必要欄位</span>
                        <span className="text-sm">缺漏：{missingFields.join('、')}</span>
                    </div>
                );
                return;
            }
        }

        const formattedItems = bomItems
            .filter(item => status === 'draft' || (item.inventory_id && item.quantity_used))
            .map(item => ({
                inventory_id: item.inventory_id ? parseInt(item.inventory_id) : null,
                quantity_used: item.quantity_used ? parseFloat(item.quantity_used) : 0,
                unit_id: item.unit_id ? parseInt(item.unit_id) : null,
            }));

        router.put(route('production-orders.update', productionOrder.id), {
            ...data,
            items: formattedItems,
            status: status,
        }, {
            onError: (errors) => {
                const errorCount = Object.keys(errors).length;
                toast.error(
                    <div className="flex flex-col gap-1">
                        <span className="font-bold">更新失敗，請檢查表單</span>
                        <span className="text-sm">共有 {errorCount} 個欄位有誤，請修正後再試</span>
                    </div>
                );
            }
        });
    };

    const handleSubmit = (e: React.FormEvent) => {
        e.preventDefault();
        submit('draft');
    };

    return (
        <AuthenticatedLayout breadcrumbs={getBreadcrumbs("productionOrdersCreate")}>
            <Head title={`編輯生產單 - ${productionOrder.code}`} />
            <Toaster position="top-right" />
            <div className="container mx-auto p-6 max-w-7xl animate-in fade-in duration-500">
                <div className="mb-6">
                    <Link href={route('production-orders.index')}>
                        <Button
                            variant="outline"
                            className="gap-2 button-outlined-primary mb-4"
                        >
                            <ArrowLeft className="h-4 w-4" />
                            返回列表
                        </Button>
                    </Link>

                    <div className="flex items-center justify-between">
                        <div>
                            <h1 className="text-2xl font-bold text-grey-0 flex items-center gap-2">
                                <Factory className="h-6 w-6 text-primary-main" />
                                編輯生產工單：{productionOrder.code}
                            </h1>
                            <p className="text-gray-500 mt-1">
                                僅限草稿狀態可進行內容修正
                            </p>
                        </div>
                        <div className="flex gap-2">
                            <Button
                                onClick={() => submit('draft')}
                                disabled={processing}
                                className="gap-2 button-filled-primary"
                            >
                                <Save className="h-4 w-4" />
                                儲存 (草稿)
                            </Button>
                        </div>
                    </div>
                </div>

                <form onSubmit={handleSubmit} className="space-y-6">
                    <div className="bg-white p-6 rounded-lg shadow-sm border border-gray-200 mb-6">
                        <h2 className="text-lg font-semibold mb-4">成品資訊</h2>
                        <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
                            <div className="space-y-1">
                                <Label className="text-xs font-medium text-grey-2">成品商品 *</Label>
                                <SearchableSelect
                                    value={data.product_id}
                                    onValueChange={(v) => setData('product_id', v)}
                                    options={products.map(p => ({
                                        label: `${p.name} (${p.code})`,
                                        value: String(p.id),
                                    }))}
                                    placeholder="選擇成品"
                                    className="w-full h-9"
                                />
                                {errors.product_id && <p className="text-red-500 text-xs mt-1">{errors.product_id}</p>}
                            </div>

                            <div className="space-y-1">
                                <Label className="text-xs font-medium text-grey-2">生產數量 *</Label>
                                <Input
                                    type="number"
                                    step="any"
                                    value={Number(data.output_quantity) === 0 ? '' : formatQuantity(data.output_quantity)}
                                    onChange={(e) => setData('output_quantity', e.target.value)}
                                    placeholder="例如: 50"
                                    className="h-9 font-mono"
                                />
                                {errors.output_quantity && <p className="text-red-500 text-xs mt-1">{errors.output_quantity}</p>}
                            </div>

                            <div className="space-y-1">
                                <Label className="text-xs font-medium text-grey-2">預計入庫倉庫 *</Label>
                                <SearchableSelect
                                    value={selectedWarehouse}
                                    onValueChange={setSelectedWarehouse}
                                    options={warehouses.map(w => ({
                                        label: w.name,
                                        value: String(w.id),
                                    }))}
                                    placeholder="選擇倉庫"
                                    className="w-full h-9"
                                />
                                {errors.warehouse_id && <p className="text-red-500 text-xs mt-1">{errors.warehouse_id}</p>}
                            </div>
                        </div>

                        <div className="mt-4 space-y-1">
                            <Label className="text-xs font-medium text-grey-2">備註</Label>
                            <Textarea
                                value={data.remark}
                                onChange={(e) => setData('remark', e.target.value)}
                                placeholder="生產備註..."
                                rows={2}
                                className="resize-none"
                            />
                        </div>
                    </div>

                    <div className="bg-white p-6 rounded-lg shadow-sm border border-gray-200 mb-6">
                        <div className="flex items-center justify-between mb-4">
                            <h2 className="text-lg font-semibold">原物料使用明細 (BOM)</h2>
                            <Button
                                type="button"
                                variant="outline"
                                onClick={addBomItem}
                                className="gap-2 button-filled-primary text-white"
                            >
                                <Plus className="h-4 w-4" />
                                新增原物料
                            </Button>
                        </div>

                        {bomItems.length === 0 && (
                            <div className="text-center py-8 text-gray-500">
                                <Factory className="h-8 w-8 mx-auto mb-2 text-gray-300" />
                                點擊「新增原物料」開始建立 BOM
                            </div>
                        )}

                        {bomItems.length > 0 && (
                            <div className="border rounded-lg overflow-hidden">
                                <Table>
                                    <TableHeader>
                                        <TableRow className="bg-gray-50/50">
                                            <TableHead className="w-[18%]">商品 <span className="text-red-500">*</span></TableHead>
                                            <TableHead className="w-[15%]">來源倉庫 <span className="text-red-500">*</span></TableHead>
                                            <TableHead className="w-[30%]">批號 <span className="text-red-500">*</span></TableHead>
                                            <TableHead className="w-[15%]">數量 <span className="text-red-500">*</span></TableHead>
                                            <TableHead className="w-[12%]">單位</TableHead>
                                            <TableHead className="w-[10%]"></TableHead>
                                        </TableRow>
                                    </TableHeader>
                                    <TableBody>
                                        {bomItems.map((item, index) => {
                                            const productOptions = products.map(p => ({
                                                label: `${p.name} (${p.code})`,
                                                value: String(p.id)
                                            }));

                                            const currentInventories = productInventoryMap[item.ui_product_id] || [];
                                            const filteredWarehouseOptions = Array.from(new Map(
                                                currentInventories.map((inv: InventoryOption) => [inv.warehouse_id, { label: inv.warehouse_name, value: String(inv.warehouse_id) }])
                                            ).values());

                                            const uniqueWarehouseOptions = filteredWarehouseOptions.length > 0
                                                ? filteredWarehouseOptions
                                                : (item.ui_product_id && !loadingProducts[item.ui_product_id] ? [] : []);

                                            const displayWarehouseOptions = uniqueWarehouseOptions.length > 0
                                                ? uniqueWarehouseOptions
                                                : (item.ui_warehouse_id ? [{ label: "載入中...", value: item.ui_warehouse_id }] : []);

                                            const batchOptions = currentInventories
                                                .filter((inv: InventoryOption) => String(inv.warehouse_id) === item.ui_warehouse_id)
                                                .map((inv: InventoryOption) => ({
                                                    label: inv.batch_number,
                                                    value: String(inv.id),
                                                    sublabel: `(存:${inv.quantity} | 效:${inv.expiry_date || '無'})`
                                                }));

                                            const displayBatchOptions = batchOptions.length > 0 ? batchOptions : (item.inventory_id && item.ui_batch_number ? [{ label: item.ui_batch_number, value: item.inventory_id }] : []);

                                            return (
                                                <TableRow key={index}>
                                                    <TableCell className="align-top">
                                                        <SearchableSelect
                                                            value={item.ui_product_id}
                                                            onValueChange={(v) => updateBomItem(index, 'ui_product_id', v)}
                                                            options={productOptions}
                                                            placeholder="選擇商品"
                                                            className="w-full"
                                                        />
                                                    </TableCell>

                                                    <TableCell className="align-top">
                                                        <SearchableSelect
                                                            value={item.ui_warehouse_id}
                                                            onValueChange={(v) => updateBomItem(index, 'ui_warehouse_id', v)}
                                                            options={displayWarehouseOptions as any}
                                                            placeholder={item.ui_product_id
                                                                ? (loadingProducts[item.ui_product_id]
                                                                    ? "載入庫存中..."
                                                                    : (uniqueWarehouseOptions.length === 0 ? "該商品目前無庫存" : "選擇倉庫"))
                                                                : "請先選商品"}
                                                            className="w-full"
                                                            disabled={!item.ui_product_id || (loadingProducts[item.ui_product_id])}
                                                        />
                                                    </TableCell>

                                                    <TableCell className="align-top">
                                                        <SearchableSelect
                                                            value={item.inventory_id}
                                                            onValueChange={(v) => updateBomItem(index, 'inventory_id', v)}
                                                            options={displayBatchOptions as any}
                                                            placeholder={item.ui_warehouse_id ? "選擇批號" : "請先選倉庫"}
                                                            className="w-full"
                                                            disabled={!item.ui_warehouse_id}
                                                        />
                                                        {item.inventory_id && (() => {
                                                            const selectedInv = currentInventories.find((i: InventoryOption) => String(i.id) === item.inventory_id);
                                                            if (selectedInv) {
                                                                const isInsufficient = selectedInv.quantity < parseFloat(item.ui_input_quantity || '0');
                                                                return (
                                                                    <div className={`text-xs mt-1 ${isInsufficient ? 'text-red-500 font-bold animate-pulse' : 'text-gray-500'}`}>
                                                                        有效日期: {selectedInv.expiry_date || '無'} |
                                                                        庫存: {formatQuantity(selectedInv.quantity)}
                                                                        {isInsufficient && ' (庫存不足！)'}
                                                                    </div>
                                                                );
                                                            }
                                                            return null;
                                                        })()}
                                                    </TableCell>

                                                    <TableCell className="align-top">
                                                        <Input
                                                            type="number"
                                                            step="any"
                                                            value={formatQuantity(item.ui_input_quantity)}
                                                            onChange={(e) => updateBomItem(index, 'ui_input_quantity', e.target.value)}
                                                            placeholder="0"
                                                            className="h-9 text-right"
                                                            disabled={!item.inventory_id}
                                                        />
                                                    </TableCell>

                                                    <TableCell className="align-top">
                                                        <div className="h-9 flex items-center px-1 text-sm text-gray-600 font-medium">
                                                            {item.ui_base_unit_name || '-'}
                                                        </div>
                                                    </TableCell>

                                                    <TableCell className="align-top">
                                                        <Button
                                                            type="button"
                                                            variant="outline"
                                                            size="sm"
                                                            onClick={() => removeBomItem(index)}
                                                            className="button-outlined-error"
                                                            title="刪除"
                                                        >
                                                            <Trash2 className="h-4 w-4" />
                                                        </Button>
                                                    </TableCell>
                                                </TableRow>
                                            );
                                        })}
                                    </TableBody>
                                </Table>
                            </div>
                        )}

                        {errors.items && <p className="text-red-500 text-sm mt-2">{errors.items}</p>}
                    </div>

                </form>
            </div>
        </AuthenticatedLayout>
    );
}
