import { useForm } from '@inertiajs/vue3';
import { computed, ref, watch } from 'vue';
import type { AuctionFormImage } from '@/components/online-auctions/AuctionImageUploadFields.vue';
import { useOnlineAuctionUploadLimits } from '@/composables/useOnlineAuctionUploadLimits';
import { usePlateGeneratorPreviewUrl } from '@/composables/usePlateGeneratorPreviewUrl';
import { AuctionFormat, type AuctionFormat as AuctionFormatValue } from '@/enums/auctionFormat';
import { AuctionStatus } from '@/enums/auctionStatus';
import type { AuctionEditData, AuctionFormLookups } from '@/types/adminAuctionForm';
import { auctionFormLabels, buildAuctionEditFormData } from '@/utils/auctionAdminForm';
import { pendingUploadFiles, persistedUploadIds } from '@/utils/auctionFormUploads';
import { adminDashboardBreadcrumb } from '@/utils/adminBreadcrumbs';
import { isPlatePreviewReady } from '@/utils/platePreview';

export function useAuctionEditForm(
    format: AuctionFormatValue,
    props: {
        auction: AuctionEditData;
        updateUrl: string;
        lookups: AuctionFormLookups;
        platePreviewUrl: string;
    },
) {
    const labels = auctionFormLabels(format);
    const isOnline = computed(() => format === AuctionFormat.Online);

    const breadcrumbData = [
        adminDashboardBreadcrumb(),
        { name: labels.listName, href: route(labels.indexRoute) },
        { name: 'Edit Auction', href: '/', disabled: true },
    ];

    const auctionImages = ref<AuctionFormImage[]>([...props.auction.uploads]);
    const vehicleHistoryReportFile = ref<File | null>(null);

    const form = useForm(buildAuctionEditFormData(props.auction));

    const activeCategory = computed(() => props.auction.category);
    const showCountdown = computed(() => props.auction.status === AuctionStatus.Published);

    const platePreviewFields = computed(() => ({
        combination: form.combination,
        state: form.state,
        background_id: form.background_id,
        characters_id: form.characters_id,
        category_id: form.category_id,
        frame: form.frame,
        display_state: form.display_state,
        display_position: form.display_position,
        width: form.width,
    }));

    const platePreviewReady = computed(
        () => activeCategory.value === 'plate' && isPlatePreviewReady(platePreviewFields.value),
    );

    const { previewUrl: livePlatePreviewUrl, isPreviewLoading: isPlatePreviewLoading } =
        usePlateGeneratorPreviewUrl(platePreviewFields, props.platePreviewUrl, {
            initialUrl: props.auction.plate_image_url ?? null,
        });

    const plateDisplayUrl = computed(() =>
        platePreviewReady.value ? livePlatePreviewUrl.value : null,
    );

    const uploadMaxFiles = useOnlineAuctionUploadLimits(activeCategory);

    watch(
        auctionImages,
        (images) => {
            form.upload_ids = persistedUploadIds(images);
        },
        { deep: true },
    );

    watch(
        () => form.combination,
        (combination) => {
            if (activeCategory.value === 'plate') {
                form.title = combination;
            }
        },
    );

    function submit(): void {
        if (activeCategory.value === 'plate') {
            form.title = form.combination;
        }

        if (activeCategory.value === 'car_parts_memorabilia') {
            form.item_description = form.description;
            form.item_specifications = form.specifications;
            form.item_condition = form.condition;
        }

        form
            .transform((data) => ({
                ...data,
                _method: 'put',
                upload_ids: persistedUploadIds(auctionImages.value),
                upload_files: pendingUploadFiles(auctionImages.value),
                vehicle_history_report_file: vehicleHistoryReportFile.value,
                vehicle_history_report_id: vehicleHistoryReportFile.value ? null : data.vehicle_history_report_id,
            }))
            .post(props.updateUrl, {
                forceFormData: true,
                preserveScroll: true,
            });
    }

    return {
        labels,
        isOnline,
        breadcrumbData,
        form,
        auction: props.auction,
        auctionImages,
        vehicleHistoryReportFile,
        activeCategory,
        showCountdown,
        uploadMaxFiles,
        platePreviewReady,
        isPlatePreviewLoading,
        plateDisplayUrl,
        submit,
        lookups: props.lookups,
    };
}
