// Pages Function: sube una imagen (producto/logo/portada) directo a Cloudflare R2
// (bucket gustito-menu, servido por img.gustitoxpress.app), NO por Supabase Storage.
// Valida que el llamador sea dueño/staff del negocio con su JWT de Supabase; la
// imagen queda bajo la carpeta {restaurante_id}/{tipo}/ del propio negocio.
// El binding R2 (MENU_BUCKET) y SUPABASE_ANON_KEY se configuran en el proyecto Pages.

const SUPABASE_URL = 'https://szzhhlevtrcambcoytiz.supabase.co';
const IMG_BASE = 'https://img.gustitoxpress.app';
const MIME_OK = ['image/jpeg', 'image/png', 'image/webp', 'image/gif'];
const CARPETAS_OK = ['productos', 'logos', 'portadas'];

function json(obj: unknown, status = 200): Response {
  return new Response(JSON.stringify(obj), { status, headers: { 'Content-Type': 'application/json' } });
}

type Env = { MENU_BUCKET: { put: (key: string, body: unknown, opts?: unknown) => Promise<unknown> }; SUPABASE_ANON_KEY?: string };

export async function onRequestPost(context: { request: Request; env: Env }): Promise<Response> {
  const { request, env } = context;
  try {
    const anon = env.SUPABASE_ANON_KEY;
    if (!anon) return json({ error: 'Config del servidor incompleta' }, 500);
    const auth = request.headers.get('Authorization');
    if (!auth) return json({ error: 'No autorizado' }, 401);

    // 1) Validar sesión + rol/restaurante.
    const uRes = await fetch(`${SUPABASE_URL}/auth/v1/user`, { headers: { Authorization: auth, apikey: anon } });
    if (!uRes.ok) return json({ error: 'Sesión inválida' }, 401);
    const user = (await uRes.json()) as { id?: string };
    if (!user?.id) return json({ error: 'Sesión inválida' }, 401);
    const pRes = await fetch(`${SUPABASE_URL}/rest/v1/perfiles?id=eq.${user.id}&select=rol,restaurante_id`, {
      headers: { Authorization: auth, apikey: anon },
    });
    const perfil = ((pRes.ok ? await pRes.json() : []) as { rol?: string; restaurante_id?: string }[])?.[0];
    if (!perfil || !['dueno', 'staff', 'admin'].includes(perfil.rol ?? '') || !perfil.restaurante_id) {
      return json({ error: 'Solo el negocio puede subir imágenes' }, 403);
    }

    // 2) Leer y validar la imagen.
    const form = await request.formData();
    const file = form.get('file');
    const tipo = String(form.get('tipo') ?? 'productos');
    if (!(file instanceof File)) return json({ error: 'Falta la imagen' }, 400);
    if (!CARPETAS_OK.includes(tipo)) return json({ error: 'Tipo inválido' }, 400);
    if (file.size > 5 * 1024 * 1024) return json({ error: 'La imagen es muy grande (máx 5MB)' }, 400);
    if (!MIME_OK.includes(file.type)) return json({ error: 'Solo imágenes (jpg, png, webp, gif)' }, 400);

    // 3) Subir a R2 bajo la carpeta del propio negocio.
    const ext = ((file.name.split('.').pop() ?? 'jpg').toLowerCase().replace(/[^a-z0-9]/g, '')) || 'jpg';
    const key = `${perfil.restaurante_id}/${tipo}/${crypto.randomUUID()}.${ext}`;
    await env.MENU_BUCKET.put(key, file.stream(), { httpMetadata: { contentType: file.type } });

    return json({ url: `${IMG_BASE}/${key}` });
  } catch (e) {
    return json({ error: 'No se pudo subir la imagen', detalle: String(e) }, 500);
  }
}
