import exifr from 'exifr';

export interface ExtractedMetadata {
    caption: string | null;
    dateTaken: Date | null;
    latitude: number | null;
    longitude: number | null;
    location: string | null;
}

/**
 * Extract EXIF metadata from a photo buffer
 */
export async function extractExifMetadata(buffer: Buffer): Promise<ExtractedMetadata> {
    // eslint-disable-next-line @typescript-eslint/no-explicit-any
    let metadata: Record<string, any> = {};
    try {
        metadata = await exifr.parse(buffer, {
            tiff: true,
            xmp: true,
            iptc: true,
            exif: true,
            gps: true,
            icc: false,
            makerNote: false,
            userComment: false,
            translateKeys: true,
            translateValues: true,
            reviveValues: true,
        }) || {};
    } catch {
        // Metadata parsing failed, continue with empty metadata
    }

    const caption = metadata?.Caption || metadata?.['Caption-Abstract'] || metadata?.ImageDescription || metadata?.xpTitle || null;
    const dateTaken = metadata?.DateTimeOriginal || metadata?.CreateDate || null;

    let latitude: number | null = null;
    let longitude: number | null = null;
    let location: string | null = null;

    if (metadata?.latitude && metadata?.longitude) {
        latitude = metadata.latitude;
        longitude = metadata.longitude;
        location = `${metadata.latitude}, ${metadata.longitude}`;
    }

    return {
        caption: caption ? String(caption) : null,
        dateTaken: dateTaken ? new Date(dateTaken) : null,
        latitude,
        longitude,
        location,
    };
}
