// Cliente do editor de imagem — fala com /api/gemini/edit no servidor.
// A chave do Gemini fica no backend (GEMINI_API_KEY no .env).

function fileToBase64(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = () => {
      const dataUrl = reader.result;
      const base64 = dataUrl.split(',')[1];
      resolve({ base64, mime: file.type || 'image/jpeg', dataUrl });
    };
    reader.onerror = reject;
    reader.readAsDataURL(file);
  });
}

// 1) Se for HEIC/HEIF, decodifica via heic2any (wasm libheif).
// 2) Depois normaliza tamanho/qualidade via canvas.
async function toJpegBlob(file, { maxSide = 2048, quality = 0.9 } = {}) {
  const name = file.name || '';
  const isHeic = /hei[cf]/i.test(file.type) || /\.hei[cf]$/i.test(name);

  let source = file;
  if (isHeic) {
    if (typeof heic2any !== 'function') {
      throw new Error('Biblioteca HEIC não carregou. Recarregue a página e tente de novo.');
    }
    const converted = await heic2any({ blob: file, toType: 'image/jpeg', quality });
    const jpegBlob = Array.isArray(converted) ? converted[0] : converted;
    source = new File([jpegBlob], name.replace(/\.[^.]+$/, '') + '.jpg', { type: 'image/jpeg' });
  }

  if (source.type === 'image/jpeg' && source.size <= 4 * 1024 * 1024) return source;

  let bitmap;
  try {
    bitmap = await createImageBitmap(source);
  } catch (e) {
    throw new Error('Não foi possível abrir essa imagem. Tente salvar como JPEG.');
  }

  const scale = Math.min(1, maxSide / Math.max(bitmap.width, bitmap.height));
  const w = Math.round(bitmap.width * scale);
  const h = Math.round(bitmap.height * scale);
  const canvas = document.createElement('canvas');
  canvas.width = w; canvas.height = h;
  const ctx = canvas.getContext('2d');
  ctx.drawImage(bitmap, 0, 0, w, h);
  bitmap.close?.();

  const blob = await new Promise((res, rej) =>
    canvas.toBlob(b => b ? res(b) : rej(new Error('Falha ao gerar JPEG.')), 'image/jpeg', quality)
  );
  return new File([blob], (name || 'photo').replace(/\.[^.]+$/, '') + '.jpg', { type: 'image/jpeg' });
}

// Retorna { dataUrl, galId } — galId é o id da linha criada em gallery
// (usado pelo editor para rastrear re-edições como parentGenerationId).
async function editImageWithGemini({ file, prompt, presetName, parentGenerationId, purchaseId }) {
  const { base64, mime } = await fileToBase64(file);
  return window.DB.editWithGemini({ prompt, mime, base64, presetName, parentGenerationId, purchaseId });
}

Object.assign(window, { editImageWithGemini, fileToBase64 });
