'use server';

import { and, eq } from 'drizzle-orm';
import { revalidatePath } from 'next/cache';
import { db } from '@/db';
import { galeriaFotos } from '@/db/schema';
import { getCurrentTenantId as getTenantId } from '@/lib/auth/current-user';
import { GALERIA_MAX_FOTOS } from '@/lib/galeria';

const GALERIA_MAX_BYTES = 2_000_000;
const GALERIA_TIPOS = ['image/png', 'image/jpeg', 'image/webp'];

export type GaleriaResult = { ok: boolean; error?: string };

export async function subirFotoGaleria(
  _prev: GaleriaResult | null,
  formData: FormData
): Promise<GaleriaResult> {
  const tenantId = await getTenantId();
  const file = formData.get('foto');
  if (!(file instanceof File) || file.size === 0) {
    return { ok: false, error: 'Selecciona una imagen.' };
  }
  if (!GALERIA_TIPOS.includes(file.type)) {
    return { ok: false, error: 'Formato no válido. Usa PNG, JPG o WEBP.' };
  }
  if (file.size > GALERIA_MAX_BYTES) {
    return { ok: false, error: 'La imagen no puede superar los 2 MB.' };
  }

  const existentes = await db
    .select({ id: galeriaFotos.id })
    .from(galeriaFotos)
    .where(eq(galeriaFotos.tenantId, tenantId));
  if (existentes.length >= GALERIA_MAX_FOTOS) {
    return { ok: false, error: `Has alcanzado el máximo de ${GALERIA_MAX_FOTOS} fotos.` };
  }

  const titulo = String(formData.get('titulo') ?? '').trim() || null;
  const base64 = Buffer.from(await file.arrayBuffer()).toString('base64');
  const dataUri = `data:${file.type};base64,${base64}`;

  await db
    .insert(galeriaFotos)
    .values({ tenantId, url: dataUri, titulo, orden: existentes.length });
  revalidatePath('/panel/galeria');
  return { ok: true };
}

export async function eliminarFotoGaleria(id: string) {
  const tenantId = await getTenantId();
  await db
    .delete(galeriaFotos)
    .where(and(eq(galeriaFotos.id, id), eq(galeriaFotos.tenantId, tenantId)));
  revalidatePath('/panel/galeria');
}
