import { createAdminClient } from "@/lib/supabase-server";

import { criarLiberacaoLembrada, type LinhaDeLiberacao } from "./liberacao";

/*
 * A área "Produtos digitais" (e as lives) liberada pela variável
 * DIGITAIS_LIBERADOS OU pela tabela `digitais_ajustes` (migration 193), que só
 * a chave de serviço lê. Vale um OU outro; o id pode ser o da empresa ou o do
 * dono.
 *
 * Toda rota da área pergunta isso: a resposta do banco fica lembrada por um
 * minuto. Quem mudar a liberação chama `esquecerLiberacaoDosDigitais`. Se o
 * banco falhar, vale a variável (ou a última resposta lembrada).
 */

declare global {
  var __liberacaoDosDigitais: ReturnType<typeof criarLiberacaoLembrada> | undefined;
}

function liberacao() {
  globalThis.__liberacaoDosDigitais ??= criarLiberacaoLembrada({
    ler: async (ids) => {
      const { data, error } = await createAdminClient().from("digitais_ajustes").select("company_id,liberado").in("company_id", ids);
      if (error) throw new Error(error.message);
      return (data ?? []) as LinhaDeLiberacao[];
    },
    aoFalhar: (erro) => console.error("[digitais] ler liberação", erro instanceof Error ? erro.message : String(erro)),
  });
  return globalThis.__liberacaoDosDigitais;
}

/** A empresa pode usar Produtos digitais? Variável do servidor OU liberação no banco. */
export function digitaisLiberadosAgora(ids: Array<string | null | undefined>): Promise<boolean> {
  return liberacao().consultar(ids);
}

/** Esquece a lembrança (de todos, ou só dessas empresas). */
export function esquecerLiberacaoDosDigitais(ids?: Array<string | null | undefined>): void {
  liberacao().esquecer(ids);
}
