import { fileURLToPath } from "url"
import { readFile } from "fs/promises"
import mime from 'mime-types'
import { extname } from "path"
import { ImageData } from "."

export const downloadImage = async (imageUrl: string): Promise<ImageData> => {
  const url = new URL(imageUrl)

  let buffer: Buffer
  let mimeType: string

  if (url.protocol === 'file:') {
    const filePath = fileURLToPath(imageUrl)
    buffer = await readFile(filePath)
    mimeType = mime.lookup(extname(filePath)) || 'image/png'
  } else {
    const response = await fetch(imageUrl)
    if (!response.ok) {
      throw new Error(`Failed to fetch image: ${response.statusText}, URL: ${imageUrl}`)
    }
  
    const arrayBuffer = await response.arrayBuffer()
    buffer = Buffer.from(arrayBuffer)
    mimeType = response.headers.get('content-type') || 'image/png'
  }

  if (!['image/png', 'image/jpeg', 'image/jpg', 'image/webp', "image/svg+xml"].includes(mimeType)) {
    throw new Error(`Unsupported image type: ${mimeType}`)
  }

  if (mimeType === 'image/svg+xml') {
    return {
      data: buffer.toString('utf-8'),
      mimeType,
    }
  }

  return {
    data: buffer.toString('base64'),
    mimeType,
  }
}

export const downloadImages = async (imageUrls: string[]): Promise<ImageData[]> => {
  const imagePromises = imageUrls.map(downloadImage)
  const images = await Promise.all(imagePromises)
  return images
}
