import type { AuctionFormImage } from '@/components/online-auctions/AuctionImageUploadFields.vue';

export function createPendingAuctionImage(file: File): AuctionFormImage {
    return {
        pendingKey: crypto.randomUUID(),
        file,
        previewUrl: URL.createObjectURL(file),
        name: file.name,
        type: file.type.split('/').pop() ?? file.name.split('.').pop() ?? 'jpg',
    };
}

export function revokeAuctionImagePreview(image: AuctionFormImage): void {
    if (image.previewUrl?.startsWith('blob:')) {
        URL.revokeObjectURL(image.previewUrl);
    }
}

export function revokeAuctionImagePreviews(images: AuctionFormImage[]): void {
    images.forEach(revokeAuctionImagePreview);
}

export function persistedUploadIds(images: AuctionFormImage[]): number[] {
    return images
        .filter((image): image is AuctionFormImage & { upload_id: number } => image.upload_id != null)
        .map((image) => image.upload_id);
}

export function pendingUploadFiles(images: AuctionFormImage[]): File[] {
    return images
        .filter((image): image is AuctionFormImage & { file: File } => image.file instanceof File)
        .map((image) => image.file);
}

export function remainingAuctionImageSlots(images: AuctionFormImage[], maxFiles: number): number {
    return Math.max(0, maxFiles - images.length);
}

/**
 * Append as many selected files as fit under the category upload limit.
 */
export function appendAuctionImagesWithinLimit(
    images: AuctionFormImage[],
    files: readonly File[],
    maxFiles: number,
): { images: AuctionFormImage[]; rejectedCount: number } {
    const remaining = remainingAuctionImageSlots(images, maxFiles);

    if (remaining === 0) {
        return { images, rejectedCount: files.length };
    }

    const accepted = files.slice(0, remaining);

    return {
        images: [...images, ...accepted.map((file) => createPendingAuctionImage(file))],
        rejectedCount: files.length - accepted.length,
    };
}
