import { Head, useForm } from '@inertiajs/react';

import { AdminLayout } from '@/layouts/admin-layout';

import {
    normalizeOrderForm,
    OrderForm,
    toDateTimeInputValue,
} from './order-form';
import type {
    CustomerOption,
    OrderFormData,
    ProductOption,
    SelectOption,
} from './order-form';

type OrderItem = {
    id: number;
    product_id: number | null;
    product_name: string;
    product_slug: string | null;
    sku: string | null;
    quantity: number;
    unit_price_minor: number;
    line_total_minor: number;
};

type AdminOrder = {
    id: number;
    user_id: number | null;
    order_number: string;
    status: string;
    currency: string;
    total_minor: number;
    customer_name: string;
    customer_email: string;
    customer_phone: string | null;
    address_line1: string;
    address_line2: string | null;
    city: string;
    postal_code: string;
    country: string;
    notes: string | null;
    placed_at: string | null;
    items: OrderItem[];
};

type AdminOrderEditProps = {
    order: AdminOrder;
    statusOptions: SelectOption[];
    customerOptions: CustomerOption[];
    productOptions: ProductOption[];
};

export default function AdminOrderEdit({
    order,
    statusOptions,
    customerOptions,
    productOptions,
}: AdminOrderEditProps) {
    const form = useForm<OrderFormData>({
        user_id: order.user_id === null ? '' : String(order.user_id),
        order_number: order.order_number,
        status: order.status,
        currency: order.currency,
        total_minor: String(order.total_minor),
        customer_name: order.customer_name,
        customer_email: order.customer_email,
        customer_phone: order.customer_phone || '',
        address_line1: order.address_line1,
        address_line2: order.address_line2 || '',
        city: order.city,
        postal_code: order.postal_code,
        country: order.country,
        notes: order.notes || '',
        placed_at: toDateTimeInputValue(order.placed_at),
        items: order.items.map((item) => ({
            product_id: item.product_id === null ? '' : String(item.product_id),
            product_name: item.product_name,
            product_slug: item.product_slug || '',
            sku: item.sku || '',
            quantity: String(item.quantity),
            unit_price_minor: String(item.unit_price_minor),
            line_total_minor: String(item.line_total_minor),
        })),
    });

    const submit = (event: React.FormEvent<HTMLFormElement>) => {
        event.preventDefault();

        form.transform(normalizeOrderForm);
        form.put(`/admin/orders/${order.id}`);
    };

    return (
        <AdminLayout>
            <Head title={`Edit Order ${order.order_number}`} />

            <OrderForm
                title={`Edit Order ${order.order_number}`}
                submitLabel="Update Order"
                backHref={`/admin/orders/${order.id}`}
                form={form}
                statusOptions={statusOptions}
                customerOptions={customerOptions}
                productOptions={productOptions}
                onSubmit={submit}
            />
        </AdminLayout>
    );
}
