import { AuctionFormat, type AuctionFormat as AuctionFormatValue } from '@/enums/auctionFormat';
import type { EnquiryDetail } from '@/types/onlineAuctionEnquiry';
import { OTHER_CAR_MAKE_ID } from '@/utils/carMakes';

export const auctionItemFormDefaults = {
    reserve_price: '',
    payment_methods: '',
    title: '',
    description: '',
    upload_ids: [] as number[],
    state: '',
    combination: '',
    background_id: null as number | null,
    characters_id: null as number | null,
    category_id: null as number | null,
    vehicle_id: null as number | null,
    frame: false,
    width: 'fixed',
    display_state: false,
    display_position: 'left',
    category_heading: null as string | null,
    specifications: null as string | null,
    year: null as number | null,
    make_id: null as number | null,
    other_make: null as string | null,
    model: null as string | null,
    odometer_km: null as number | null,
    body_type: null as string | null,
    engine: null as string | null,
    exterior_colour: null as string | null,
    interior_colour: null as string | null,
    doors: null as number | null,
    transmission: null as string | null,
    drive_side: null as string | null,
    service_history: null as string | null,
    car_inspection: null as string | null,
    condition: null as string | null,
    vehicle_history_report_id: null as number | null,
    item_description: null as string | null,
    item_specifications: null as string | null,
    item_condition: null as string | null,
};

export function buildAuctionCreateFormData(
    format: AuctionFormatValue,
    selectedEnquiryId: number | null,
): Record<string, unknown> {
    return {
        auction_enquiry_id: selectedEnquiryId,
        is_scheduled: false,
        client_start_date_time: null as string | null,
        ...(format === AuctionFormat.Online
            ? {
                  is_featured: true,
                  period_type: 'days',
                  period_length: 7,
              }
            : {
                  headline_time: '',
                  period_type: 'days',
                  period_length: 7,
              }),
        ...auctionItemFormDefaults,
    };
}

export function buildAuctionEditFormData(auction: {
    category: string;
    is_featured?: boolean;
    headline_time?: string;
    reserve_price: string;
    payment_methods: string;
    title: string;
    description: string;
    uploads: { upload_id: number }[];
    state: string;
    combination?: string;
    background_id?: number | null;
    characters_id?: number | null;
    category_id?: number | null;
    vehicle_id?: number | null;
    frame?: boolean;
    width?: string;
    display_state?: boolean;
    display_position?: string;
    category_heading?: string | null;
    specifications?: string | null;
    year?: number | null;
    make_id?: number | null;
    other_make?: string | null;
    model?: string | null;
    odometer_km?: number | null;
    body_type?: string | null;
    engine?: string | null;
    exterior_colour?: string | null;
    interior_colour?: string | null;
    doors?: number | null;
    transmission?: string | null;
    drive_side?: string | null;
    service_history?: string | null;
    car_inspection?: string | null;
    condition?: string | null;
    vehicle_history_report_id?: number | null;
    item_description?: string | null;
    item_specifications?: string | null;
    item_condition?: string | null;
}): Record<string, unknown> {
    return {
        ...(auction.is_featured !== undefined ? { is_featured: auction.is_featured } : {}),
        ...(auction.headline_time !== undefined ? { headline_time: auction.headline_time } : {}),
        reserve_price: auction.reserve_price,
        payment_methods: auction.payment_methods,
        title: auction.title,
        description:
            auction.category === 'car_parts_memorabilia'
                ? (auction.description || auction.item_description || '')
                : auction.description,
        upload_ids: auction.uploads.map((upload) => upload.upload_id),
        state: auction.state,
        combination: auction.combination ?? '',
        background_id: auction.background_id ?? null,
        characters_id: auction.characters_id ?? null,
        category_id: auction.category_id ?? null,
        vehicle_id: auction.vehicle_id ?? null,
        frame: auction.frame ?? false,
        width: auction.width ?? 'fixed',
        display_state: auction.display_state ?? false,
        display_position: auction.display_position ?? 'left',
        category_heading: auction.category_heading ?? null,
        specifications:
            auction.category === 'car_parts_memorabilia'
                ? (auction.item_specifications ?? null)
                : (auction.specifications ?? null),
        year: auction.year ?? null,
        make_id: auction.make_id ?? null,
        other_make: auction.other_make ?? null,
        model: auction.model ?? null,
        odometer_km: auction.odometer_km ?? null,
        body_type: auction.body_type ?? null,
        engine: auction.engine ?? null,
        exterior_colour: auction.exterior_colour ?? null,
        interior_colour: auction.interior_colour ?? null,
        doors: auction.doors ?? null,
        transmission: auction.transmission ?? null,
        drive_side: auction.drive_side ?? null,
        service_history: auction.service_history ?? null,
        car_inspection: auction.car_inspection ?? null,
        condition:
            auction.category === 'car_parts_memorabilia'
                ? (auction.item_condition ?? null)
                : (auction.condition ?? null),
        vehicle_history_report_id: auction.vehicle_history_report_id ?? null,
        item_description: auction.item_description ?? null,
        item_specifications: auction.item_specifications ?? null,
        item_condition: auction.item_condition ?? null,
        period_type: 'days',
        period_length: 7,
    };
}

export function prefillAuctionFormFromEnquiry(
    form: {
        upload_ids: number[];
        state: string;
        combination: string;
        title: string;
        year: number | null;
        make_id: number | null;
        other_make: string | null;
        model: string | null;
        odometer_km: number | null;
        description: string;
    },
    enquiry: EnquiryDetail,
): void {
    form.state = enquiry.state ?? '';

    if (enquiry.category === 'plate') {
        const combination = (enquiry.plate_combination ?? '').toUpperCase();
        form.combination = combination;
        form.title = combination;
    }

    if (enquiry.category === 'car') {
        form.year = enquiry.year ? Number(enquiry.year) : null;

        if (enquiry.make_id) {
            form.make_id = enquiry.make_id;
            form.other_make = enquiry.other_make ?? null;
        } else {
            form.make_id = OTHER_CAR_MAKE_ID;
            form.other_make = enquiry.other_make ?? enquiry.make_name ?? null;
        }

        form.model = enquiry.model ?? null;
        form.odometer_km = enquiry.odometer_km ?? null;

        if (enquiry.year && enquiry.make_name && enquiry.model) {
            form.title = `${enquiry.year} ${enquiry.make_name} ${enquiry.model}`.trim();
        }
    }

    if (enquiry.category === 'car_parts_memorabilia') {
        form.description = enquiry.item_description ?? '';
        form.title = enquiry.item_description ?? '';
    }
}

export function auctionFormLabels(format: AuctionFormatValue): {
    indexRoute: string;
    listName: string;
    createHeadTitle: string;
    createPageTitle: string;
    createSubmitLabel: string;
    editHeadTitle: string;
    editPageTitle: string;
} {
    if (format === AuctionFormat.Online) {
        return {
            indexRoute: 'admin.online-auctions.index',
            listName: 'Online Auctions',
            createHeadTitle: 'Create Online Auction',
            createPageTitle: 'Create Online Auction',
            createSubmitLabel: 'Create Auction',
            editHeadTitle: 'Edit Online Auction',
            editPageTitle: 'Edit Online Auction',
        };
    }

    return {
        indexRoute: 'admin.in-person-auctions.index',
        listName: 'In-Person Auctions',
        createHeadTitle: 'Create In-Person Auction',
        createPageTitle: 'Create In-Person Auction',
        createSubmitLabel: 'Create In-Person Auction',
        editHeadTitle: 'Edit In-Person Auction',
        editPageTitle: 'Edit In-Person Auction',
    };
}
