import { CONFIGURACOES_PADRAO, lerConfiguracoes } from "@/lib/digitais/configuracoes";
import { limitesDaLoja } from "@/lib/digitais/limites";
import { configuracaoDoR2 } from "@/lib/digitais/r2";
import { ambienteFiscal } from "@/lib/fiscal/ambiente";

import { ErroDigital, type ContextoDigital } from "../contexto";
import { enderecoDaAreaDeMembros, lerLojaDosDigitais } from "../loja";

/* As configurações dos produtos digitais da loja (tela Configurações), fora
   da rota: o assistente (MCP) lê e grava pelas mesmas funções. */

export async function lerConfiguracoesDaArea({ admin, lojaId, pode, situacao }: ContextoDigital, request: Request) {
  const [{ data, error }, loja, espaco, emissor] = await Promise.all([
    admin.from("digital_settings").select("config,atualizado_em").eq("user_id", lojaId).maybeSingle(),
    lerLojaDosDigitais(admin, lojaId),
    admin.rpc("espaco_digital_da_loja", { p_loja: lojaId }),
    /* A nota de serviço (NFS-e) já configurada em Notas fiscais? */
    admin.from("fiscal_emissores").select("status,nfse").eq("empresa_id", lojaId).eq("ambiente", ambienteFiscal()).maybeSingle(),
  ]);
  const linhaDoEmissor = emissor.data as { status?: string | null; nfse?: { ativo?: unknown } | null } | null;
  if (error) throw new ErroDigital("Não foi possível ler as configurações.", 500);
  return {
    config: lerConfiguracoes(data?.config),
    padrao: CONFIGURACOES_PADRAO,
    atualizadoEm: data?.atualizado_em ?? null,
    podeMudar: pode("digital.settings.write"),
    loja: {
      nome: loja.nome,
      cor: loja.cor,
      dominio: loja.dominio,
      enderecoDaArea: enderecoDaAreaDeMembros(request, loja),
    },
    deposito: configuracaoDoR2() !== null,
    nfseConfigurada: linhaDoEmissor?.status === "ativo" && linhaDoEmissor?.nfse?.ativo === true,
    espaco: {
      usado: Number((espaco.data as { usado?: unknown } | null)?.usado ?? 0),
      ...limitesDaLoja(situacao),
    },
  };
}

export async function salvarConfiguracoesDaArea({ admin, lojaId, user }: ContextoDigital, corpo: unknown) {
  if (!corpo || typeof corpo !== "object" || !("config" in corpo)) {
    throw new ErroDigital("Não recebemos as configurações.", 400);
  }
  const config = lerConfiguracoes((corpo as { config: unknown }).config);
  const agora = new Date().toISOString();
  const { error } = await admin
    .from("digital_settings")
    .upsert({ user_id: lojaId, config, atualizado_em: agora, atualizado_por: user.id }, { onConflict: "user_id" });
  if (error) throw new ErroDigital("Não foi possível salvar as configurações.", 500);
  return { ok: true, config, atualizadoEm: agora };
}
