import { getSupabaseClient } from "@/lib/supabase";
import type { DocumentoDoBanner } from "./documento";

/*
 * O histórico de versões das artes (migration 225, versoes_da_arte): o banco
 * guarda sozinho o jeito anterior da arte quando ela é guardada e a última
 * versão tem mais de 10 minutos; aqui o editor lista, guarda uma na hora e
 * busca o documento de uma para voltar.
 */

export type ResumoDaVersao = { id: string; nome: string; largura: number; altura: number; quando: string; manual: boolean; documento: DocumentoDoBanner };

export class VersoesIndisponiveis extends Error {}

const COLUNAS = "id,nome,largura,altura,quando,manual,documento";

function faltaATabela(erro: { code?: string; message?: string } | null) {
  return Boolean(erro && (erro.code === "42P01" || erro.code === "PGRST205" || /versoes_da_arte/.test(erro.message || "")));
}

export async function listarVersoes(arteId: string): Promise<ResumoDaVersao[]> {
  const { data, error } = await getSupabaseClient().from("versoes_da_arte").select(COLUNAS).eq("arte_id", arteId).order("quando", { ascending: false }).limit(40);
  if (faltaATabela(error)) throw new VersoesIndisponiveis("O histórico de versões ainda não está ligado.");
  if (error) throw new Error("Não deu para abrir as versões.");
  return (data || []) as ResumoDaVersao[];
}

export async function guardarVersao(dono: string, arteId: string, versao: { nome: string; largura: number; altura: number; documento: DocumentoDoBanner }): Promise<ResumoDaVersao> {
  const { data, error } = await getSupabaseClient()
    .from("versoes_da_arte")
    .insert({ arte_id: arteId, user_id: dono, nome: versao.nome.slice(0, 120) || "Arte sem nome", largura: Math.round(versao.largura), altura: Math.round(versao.altura), documento: versao.documento, manual: true })
    .select(COLUNAS)
    .single();
  if (faltaATabela(error)) throw new VersoesIndisponiveis("O histórico de versões ainda não está ligado.");
  if (error || !data) throw new Error(error?.message?.includes("grande demais") ? error.message : "Não deu para guardar a versão.");
  return data as ResumoDaVersao;
}
