import { getSupabaseClient } from "@/lib/supabase";
import type { DocumentoDoBanner } from "./documento";
import type { ModeloDaComunidade } from "./comunidade-tipos";

export * from "./comunidade-tipos";

/*
 * Modelos da comunidade (migration 227, modelos_da_comunidade): a arte que um
 * assinante publica para as outras empresas, com o nome e o avatar de quem
 * fez. Entra pendente; o dono da plataforma aprova ou recusa no Owner. A
 * galeria mostra os aprovados na categoria do tipo deles; "Usar este modelo"
 * faz uma cópia na conta de quem usou.
 *
 * O envio passa pela rota /api/artes/comunidade (o servidor confere a arte,
 * tira o nome e o avatar do perfil e faz a miniatura); daqui só se lê e se
 * retira um envio.
 */

const COLUNAS = "id,user_id,arte_id,nome,descricao,tipo,ramo,largura,altura,formato,paginas,miniatura,autor_nome,autor_avatar,autor_loja,status,motivo,usos,avaliado_em,created_at";

/* A tabela ainda não existe no banco (migration não aplicada): a galeria segue sem a comunidade. */
const faltaATabela = (erro: { code?: string; message?: string } | null) => Boolean(erro && (erro.code === "42P01" || erro.code === "PGRST205" || /modelos_da_comunidade/.test(erro.message || "")));

/** Os aprovados (para a galeria de todas as empresas), os mais recentes primeiro. */
export async function modelosAprovados(): Promise<ModeloDaComunidade[]> {
  const { data, error } = await getSupabaseClient().from("modelos_da_comunidade").select(COLUNAS).eq("status", "aprovado").order("avaliado_em", { ascending: false }).limit(300);
  if (faltaATabela(error) || error) return [];
  return (data || []) as ModeloDaComunidade[];
}

/** Os envios da empresa (qualquer situação), para mostrar "em análise", "na comunidade" ou "recusado". */
export async function enviosDaEmpresa(dono: string): Promise<ModeloDaComunidade[]> {
  const { data, error } = await getSupabaseClient().from("modelos_da_comunidade").select(COLUNAS).eq("user_id", dono).order("created_at", { ascending: false }).limit(200);
  if (faltaATabela(error) || error) return [];
  return (data || []) as ModeloDaComunidade[];
}

/** O documento do modelo (só na hora de usar: a lista não traz). */
export async function documentoDoModelo(id: string): Promise<DocumentoDoBanner | null> {
  const { data, error } = await getSupabaseClient().from("modelos_da_comunidade").select("documento").eq("id", id).maybeSingle();
  if (error || !data) return null;
  return (data as { documento: DocumentoDoBanner }).documento;
}

export async function contarUso(id: string) {
  await getSupabaseClient().rpc("contar_uso_do_modelo_da_comunidade", { p_id: id });
}

export async function retirarEnvio(id: string) {
  const { error } = await getSupabaseClient().from("modelos_da_comunidade").delete().eq("id", id);
  if (error) throw new Error("Não deu para retirar o envio.");
}

export async function enviarParaComunidade(pedido: { arteId: string; nome: string; descricao: string; ramo: ModeloDaComunidade["ramo"] }) {
  const resposta = await fetch("/api/artes/comunidade", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ ...pedido, aceite: true }) });
  const corpo = (await resposta.json().catch(() => ({}))) as { error?: string; id?: string };
  if (!resposta.ok) throw new Error(corpo.error || "Não deu para enviar agora. Tente de novo.");
  return corpo.id as string;
}
