import { FONTES_DOS_TITULOS, FUNDOS_DA_AREA } from "@/lib/digitais/aparencia";
import { corValida, VELOCIDADES_POSSIVEIS, type ConfiguracoesDigitais } from "@/lib/digitais/configuracoes";
import { lerConfiguracoesDaArea, salvarConfiguracoesDaArea } from "@/lib/digitais/servidor/acoes/configuracoes";
import { lerVisaoGeral } from "@/lib/digitais/servidor/acoes/visao-geral";
import { digitaisLiberadosAgora } from "@/lib/digitais/liberacao-do-banco";

import { DESCRICAO_DO_CAMPO_DE_IMAGEM } from "../imagens";
import { pode, reais, recusar } from "./comum";
import { abrirDigital, guardarImagemDigital, naRota, pedidoDoAssistente, prepararImagemDigital, semContatoNovo, type ImagemDigital } from "./digitais-comum";
import { tamanhoBr } from "./digitais-regras";
import type { Ferramenta, FerramentaDeEscrita, FerramentaDeLeitura } from "./tipos";

/*
 * A área de Produtos digitais por cima: a Visão geral (vendas, quem tem
 * acesso, espaço, o que pede atenção, o endereço da área de membros) e as
 * Configurações inteiras (área de membros e a aparência dela, e-mails de
 * entrega, acesso e segurança, player, comentários, certificado, lembretes e
 * nota fiscal). As funções das rotas; permissões digital.overview.read e
 * digital.settings.read/write, como as telas.
 */

function configuracoesParaOAssistente(c: ConfiguracoesDigitais) {
  return {
    area_de_membros: {
      nome: c.area.nome ?? "(o nome da loja)",
      cor_de_destaque: c.area.cor ?? "(a cor da loja)",
      foto_de_destaque: c.area.banner,
      letra_dos_titulos: c.area.fonte,
      fundo: c.area.fundo,
      capas_dos_modulos: c.area.capas,
    },
    entrega_e_emails: {
      assunto: c.entrega.assunto,
      mensagem: c.entrega.mensagem,
      lembrar_quem_nao_abriu: c.entrega.reenviarEm24h,
      mostrar_o_acesso_no_whatsapp: c.entrega.botaoWhatsapp,
      lembrar_quem_parou_de_assistir: c.lembretes.alunosParados,
    },
    acesso_e_seguranca: {
      prazo: c.acesso.prazoDias ? `${c.acesso.prazoDias} dias` : "para sempre",
      aparelhos_ao_mesmo_tempo: c.acesso.aparelhos,
      freio_de_compartilhamento: c.acesso.freioLugares ? `ligado (${c.acesso.freioLugares} lugares em 24 horas)` : "desligado",
      marca_dagua: c.acesso.marcaDagua,
    },
    player: {
      continuar_de_onde_parou: c.player.continuar,
      marcar_como_assistido_em: `${c.player.percentualAssistida}%`,
      velocidades: c.player.velocidades,
      proximo_video_sozinho: c.player.proximaSozinha,
    },
    comentarios: { aparecem: c.comentarios.quando === "aprovacao" ? "depois_de_aprovar" : "na_hora", me_avisar: c.comentarios.avisar },
    certificado: { emitir_ao_concluir: c.certificado.emitir, assinatura: c.certificado.assinatura },
    nota_fiscal: { nfse_nas_vendas_da_loja: c.fiscal.nfseNaLoja },
  };
}

/* ------------------------------------------------------------ visão geral */

export const verAreaDigital: FerramentaDeLeitura = {
  nome: "ver_area_digital",
  titulo: "Visão geral dos produtos digitais",
  descricao:
    "Comece por aqui nos produtos digitais (e lives): se a área está liberada, o endereço da área de membros, vendas dos últimos 30 dias (e a variação), pedidos, quem tem acesso, os mais vendidos, o espaço usado e o que pede atenção (entregas pendentes ou com falha, comentários sem resposta, códigos acabando, encomendas atrasadas, acessos pausados), além do resumo das configurações.",
  campos: {},
  tipo: "leitura",
  permissoes: ["digital.overview.read"],
  async executar(ctx) {
    const liberado = await digitaisLiberadosAgora([ctx.chave.companyId, ctx.empresa.ownerId, ctx.donoDosDados]);
    if (!liberado) {
      return {
        dados: { liberado: false, aviso: "A área de Produtos digitais (com as lives) ainda não está liberada para esta empresa. Quem libera é a equipe da Ktalogu." },
        resumo: "Consultou a área digital (não liberada)",
      };
    }
    const contexto = await abrirDigital(ctx, "digital.overview.read", "ver a visão geral dos produtos digitais");
    const visao = await naRota(() => lerVisaoGeral(contexto));
    const config = pode(ctx, "digital.settings.read") ? await naRota(() => lerConfiguracoesDaArea(contexto, pedidoDoAssistente(ctx))) : null;
    const a = visao.atencao;
    return {
      dados: {
        liberado: true,
        area_de_membros: config?.loja.enderecoDaArea ?? null,
        deposito_de_arquivos_ligado: visao.deposito,
        numeros: {
          vendas_30_dias: reais(visao.numeros.vendas30),
          variacao: visao.numeros.variacao === null ? null : `${visao.numeros.variacao}%`,
          pedidos_30_dias: visao.numeros.pedidos30,
          pedidos_7_dias: visao.numeros.pedidos7,
          clientes_com_acesso: visao.numeros.comAcesso,
          produtos: visao.numeros.produtos,
        },
        mais_vendidos: visao.maisVendidos.map((m) => ({ produto_id: m.id, nome: m.nome, tipo: m.rotuloDoTipo, vendas: reais(m.valor), pedidos: m.pedidos })),
        espaco: { usado: tamanhoBr(visao.espaco.usado), total: tamanhoBr(visao.espaco.total), maximo_por_arquivo: tamanhoBr(visao.espaco.porArquivo), plano_de_teste: visao.espaco.teste },
        pede_atencao: {
          entregas_pendentes: a.entregasPendentes,
          entregas_com_falha: a.entregasComFalha,
          pedidos_sem_cliente: a.semCliente,
          arquivos_enviando: a.enviandoArquivos,
          comentarios_sem_resposta: a.comentariosSemResposta,
          produtos_com_codigos_esgotados: a.codigosEsgotados,
          produtos_com_codigos_acabando: a.codigosAcabando,
          compradores_esperando_codigo: a.codigosEsperando,
          encomendas_pendentes: a.encomendasPendentes,
          encomendas_atrasadas: a.encomendasAtrasadas,
          pedidos_pausados_pelo_freio: a.pausadosPeloFreio,
        },
        acessos_recentes: visao.recentes.map((r) => ({ cliente: r.cliente, produto: r.produto, situacao: r.status, quando: r.quando })),
        ...(config ? { configuracoes: configuracoesParaOAssistente(config.config) } : {}),
      },
      resumo: "Consultou a visão geral dos produtos digitais",
    };
  },
};

/* ------------------------------------------------------------ configurações */

export const verConfiguracoesDigitais: FerramentaDeLeitura = {
  nome: "ver_configuracoes_digitais",
  titulo: "Ver as configurações dos produtos digitais",
  descricao:
    "As Configurações dos produtos digitais, em todos os detalhes: área de membros (nome, endereço, cor de destaque, foto de destaque, letra dos títulos, fundo, formato das capas), e-mails de entrega, acesso e segurança, player, comentários, certificado, lembretes e nota fiscal, com as opções possíveis de cada um.",
  campos: {},
  tipo: "leitura",
  permissoes: ["digital.settings.read"],
  async executar(ctx) {
    const contexto = await abrirDigital(ctx, "digital.settings.read", "ver as configurações dos produtos digitais");
    const lido = await naRota(() => lerConfiguracoesDaArea(contexto, pedidoDoAssistente(ctx)));
    return {
      dados: {
        endereco_da_area_de_membros: lido.loja.enderecoDaArea,
        nome_da_loja: lido.loja.nome,
        cor_da_loja: lido.loja.cor,
        configuracoes: configuracoesParaOAssistente(lido.config),
        nota_de_servico_configurada: lido.nfseConfigurada,
        espaco: { usado: tamanhoBr(lido.espaco.usado), total: tamanhoBr(lido.espaco.total), maximo_por_arquivo: tamanhoBr(lido.espaco.porArquivo) },
        opcoes: {
          letra_dos_titulos: FONTES_DOS_TITULOS.map((f) => ({ id: f.id, nome: f.nome, jeito: f.descricao })),
          fundo: FUNDOS_DA_AREA.map((f) => ({ id: f.id, nome: f.nome })),
          capas_dos_modulos: ["em_pe", "deitada"],
          velocidades: [...VELOCIDADES_POSSIVEIS],
          palavras_do_email: ["{{primeiro_nome}}", "{{produto}}", "{{link_de_acesso}}", "{{loja}}"],
        },
        atualizado_em: lido.atualizadoEm,
      },
      resumo: "Consultou as configurações dos produtos digitais",
    };
  },
};

type CargaDasConfiguracoes = { config: ConfiguracoesDigitais; foto: ImagemDigital | null; mudancas: string[] };

const FONTES = FONTES_DOS_TITULOS.map((f) => f.id);
const FUNDOS = FUNDOS_DA_AREA.map((f) => f.id);

export const alterarConfiguracoesDigitais: FerramentaDeEscrita<CargaDasConfiguracoes> = {
  nome: "alterar_configuracoes_digitais",
  titulo: "Mudar as configurações dos produtos digitais",
  descricao:
    "Muda as Configurações dos produtos digitais, campo a campo, como a tela: a área de membros e a aparência dela (nome, cor de destaque, foto de destaque, letra dos títulos, fundo, capas dos módulos), os e-mails de entrega (assunto e mensagem com {{primeiro_nome}}, {{produto}}, {{link_de_acesso}}, {{loja}}), acesso e segurança, player, comentários, certificado, lembretes e a NFS-e automática nas vendas da loja (esta pede confirmação). Mande só o que muda.",
  campos: {
    nome_da_area: { tipo: "texto", descricao: "Nome no topo da área e nos e-mails.", max: 60 },
    usar_nome_da_loja: { tipo: "booleano", descricao: "true = volta a usar o nome da loja." },
    cor_de_destaque: { tipo: "texto", descricao: "Cor dos botões, progresso e selos, #RRGGBB (cores apagadas viram laranja).", max: 7 },
    usar_cor_da_loja: { tipo: "booleano", descricao: "true = volta a usar a cor da loja." },
    foto_de_destaque: { tipo: "texto", descricao: `A foto grande do topo da área (1920 × 1080). ${DESCRICAO_DO_CAMPO_DE_IMAGEM}`, max: 2000 },
    tirar_foto_de_destaque: { tipo: "booleano", descricao: "true = sem foto (usa a capa do conteúdo)." },
    letra_dos_titulos: { tipo: "opcao", descricao: "Letra dos títulos (veja as opções em ver_configuracoes_digitais).", opcoes: FONTES },
    fundo: { tipo: "opcao", descricao: "Fundo da área.", opcoes: FUNDOS },
    capas_dos_modulos: { tipo: "opcao", descricao: "Formato das capas: em_pe (pôster) ou deitada.", opcoes: ["em_pe", "deitada"] },
    assunto_do_email: { tipo: "texto", descricao: "Assunto do e-mail de acesso.", max: 140 },
    mensagem_do_email: { tipo: "texto", descricao: "Mensagem do e-mail de acesso (com as palavras entre chaves).", max: 2000 },
    lembrar_quem_nao_abriu: { tipo: "booleano", descricao: "Reenviar o acesso uma vez se o comprador não entrar em 24 horas." },
    mostrar_o_acesso_no_whatsapp: { tipo: "booleano", descricao: "Botão do WhatsApp com o link de acesso na tela de compra aprovada." },
    lembrar_quem_parou_de_assistir: { tipo: "booleano", descricao: "E-mail \"continue de onde parou\" para quem não assiste há 30 dias (no máximo um por mês)." },
    prazo_de_acesso: { tipo: "opcao", descricao: "Prazo padrão das compras novas.", opcoes: ["para_sempre", "dias"] },
    prazo_de_acesso_dias: { tipo: "inteiro", descricao: "Com prazo_de_acesso = dias.", min: 1, max: 3650 },
    aparelhos_ao_mesmo_tempo: { tipo: "inteiro", descricao: "Aparelhos assistindo juntos com o mesmo login.", min: 1, max: 10 },
    freio_de_compartilhamento: { tipo: "booleano", descricao: "Freio de compartilhamento (muitos lugares num dia pede para entrar de novo)." },
    lugares_em_24_horas: { tipo: "inteiro", descricao: "Com o freio ligado: quantos lugares em 24 horas.", min: 2, max: 50 },
    marca_dagua: { tipo: "booleano", descricao: "Marca d'água com o e-mail do cliente no vídeo." },
    continuar_de_onde_parou: { tipo: "booleano", descricao: "O player volta no segundo exato." },
    marcar_como_assistido_em: { tipo: "inteiro", descricao: "Porcentagem do vídeo em que conta como assistido.", min: 50, max: 100 },
    velocidades: { tipo: "textos", descricao: "Velocidades do player: 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2.", max: 4, maxItens: 7 },
    proximo_video_sozinho: { tipo: "booleano", descricao: "No fim do vídeo, passa para o próximo sozinho." },
    comentarios_aparecem: { tipo: "opcao", descricao: "Comentários aparecem na hora ou depois de aprovar.", opcoes: ["na_hora", "depois_de_aprovar"] },
    me_avisar_dos_comentarios: { tipo: "booleano", descricao: "Avisar no celular e no sino a cada comentário novo." },
    emitir_certificado: { tipo: "booleano", descricao: "Emitir o certificado quando o cliente termina todos os vídeos." },
    assinatura_do_certificado: { tipo: "texto", descricao: "Nome de quem assina o certificado (vazio = só o nome da loja).", max: 80 },
    nfse_nas_vendas_da_loja: { tipo: "booleano", descricao: "Emitir a NFS-e sozinha nas vendas de produto digital da loja virtual (pede confirmação)." },
  },
  tipo: "escrita",
  sobrescreve: true,
  permissoes: ["digital.settings.write"],
  sensivel: (args) => args.nfse_nas_vendas_da_loja !== undefined,
  async preparar(ctx, args) {
    const contexto = await abrirDigital(ctx, "digital.settings.write", "mudar as configurações dos produtos digitais");
    const lido = await naRota(() => lerConfiguracoesDaArea(contexto, pedidoDoAssistente(ctx)));
    const antes = lido.config;
    const c: ConfiguracoesDigitais = JSON.parse(JSON.stringify(antes));
    const mudancas = Object.keys(args);
    if (!mudancas.length) recusar("Nada para mudar.");

    if (args.usar_nome_da_loja === true) c.area.nome = null;
    else if (args.nome_da_area !== undefined) c.area.nome = String(args.nome_da_area);
    if (args.usar_cor_da_loja === true) c.area.cor = null;
    else if (args.cor_de_destaque !== undefined) {
      const cor = corValida(args.cor_de_destaque);
      if (!cor) recusar("A cor precisa estar no formato #RRGGBB (ex.: #FF5A1F).");
      c.area.cor = cor;
    }
    if (args.tirar_foto_de_destaque === true) c.area.banner = null;
    if (args.letra_dos_titulos !== undefined) c.area.fonte = args.letra_dos_titulos as ConfiguracoesDigitais["area"]["fonte"];
    if (args.fundo !== undefined) {
      c.area.fundo = args.fundo as ConfiguracoesDigitais["area"]["fundo"];
      c.area.aparencia = args.fundo === "claro" ? "clara" : "escura";
    }
    if (args.capas_dos_modulos !== undefined) c.area.capas = args.capas_dos_modulos as ConfiguracoesDigitais["area"]["capas"];
    if (args.assunto_do_email !== undefined) c.entrega.assunto = String(args.assunto_do_email);
    if (args.mensagem_do_email !== undefined) c.entrega.mensagem = String(args.mensagem_do_email);
    if (args.lembrar_quem_nao_abriu !== undefined) c.entrega.reenviarEm24h = args.lembrar_quem_nao_abriu === true;
    if (args.mostrar_o_acesso_no_whatsapp !== undefined) c.entrega.botaoWhatsapp = args.mostrar_o_acesso_no_whatsapp === true;
    if (args.lembrar_quem_parou_de_assistir !== undefined) c.lembretes.alunosParados = args.lembrar_quem_parou_de_assistir === true;
    if (args.prazo_de_acesso === "para_sempre") c.acesso.prazoDias = null;
    else if (args.prazo_de_acesso === "dias" || args.prazo_de_acesso_dias !== undefined) {
      if (!args.prazo_de_acesso_dias) recusar("Diga os dias em prazo_de_acesso_dias.");
      c.acesso.prazoDias = Number(args.prazo_de_acesso_dias);
    }
    if (args.aparelhos_ao_mesmo_tempo !== undefined) c.acesso.aparelhos = Number(args.aparelhos_ao_mesmo_tempo);
    if (args.freio_de_compartilhamento === false) c.acesso.freioLugares = null;
    else if (args.freio_de_compartilhamento === true || args.lugares_em_24_horas !== undefined) {
      c.acesso.freioLugares = Number(args.lugares_em_24_horas ?? antes.acesso.freioLugares ?? 5);
    }
    if (args.marca_dagua !== undefined) c.acesso.marcaDagua = args.marca_dagua === true;
    if (args.continuar_de_onde_parou !== undefined) c.player.continuar = args.continuar_de_onde_parou === true;
    if (args.marcar_como_assistido_em !== undefined) c.player.percentualAssistida = Number(args.marcar_como_assistido_em);
    if (args.velocidades !== undefined) {
      const numeros = (args.velocidades as string[]).map((v) => Number(String(v).replace(",", ".")));
      const validas = VELOCIDADES_POSSIVEIS.filter((v) => numeros.includes(v));
      if (!validas.length) recusar("Escolha velocidades entre 0.5, 0.75, 1, 1.25, 1.5, 1.75 e 2.");
      c.player.velocidades = Array.from(new Set([...validas, 1])).sort((a, b) => a - b);
    }
    if (args.proximo_video_sozinho !== undefined) c.player.proximaSozinha = args.proximo_video_sozinho === true;
    if (args.comentarios_aparecem !== undefined) c.comentarios.quando = args.comentarios_aparecem === "depois_de_aprovar" ? "aprovacao" : "na_hora";
    if (args.me_avisar_dos_comentarios !== undefined) c.comentarios.avisar = args.me_avisar_dos_comentarios === true;
    if (args.emitir_certificado !== undefined) c.certificado.emitir = args.emitir_certificado === true;
    if (args.assinatura_do_certificado !== undefined) c.certificado.assinatura = String(args.assinatura_do_certificado) || null;
    if (args.nfse_nas_vendas_da_loja !== undefined) {
      if (args.nfse_nas_vendas_da_loja === true && !lido.nfseConfigurada) {
        recusar("A nota de serviço (NFS-e) ainda não está configurada em Notas fiscais. Configure antes (ver_configuracao_fiscal) e depois ligue aqui.");
      }
      c.fiscal.nfseNaLoja = args.nfse_nas_vendas_da_loja === true;
    }

    semContatoNovo(
      `${antes.area.nome ?? ""}\n${antes.entrega.assunto}\n${antes.entrega.mensagem}\n${antes.certificado.assinatura ?? ""}`,
      `${c.area.nome ?? ""}\n${c.entrega.assunto}\n${c.entrega.mensagem}\n${c.certificado.assinatura ?? ""}`,
      "em Produtos digitais, Configurações"
    );
    const foto = args.foto_de_destaque ? await prepararImagemDigital(ctx, args.foto_de_destaque, "larga") : null;
    return {
      previa: { mudancas, ...(foto ? { foto_de_destaque: foto.origem } : {}), ...(args.nfse_nas_vendas_da_loja !== undefined ? { nfse_nas_vendas_da_loja: args.nfse_nas_vendas_da_loja } : {}) },
      resumo: "Prévia da mudança nas configurações dos produtos digitais",
      avisos: args.nfse_nas_vendas_da_loja === true ? ["A partir de agora, cada venda de produto digital na loja virtual emite a NFS-e sozinha."] : [],
      carga: { config: c, foto, mudancas },
    };
  },
  async gravar(ctx, carga) {
    const contexto = await abrirDigital(ctx, "digital.settings.write", "mudar as configurações dos produtos digitais");
    const config = { ...carga.config, area: { ...carga.config.area } };
    if (carga.foto) config.area.banner = await guardarImagemDigital(ctx, carga.foto, "digitais/banners");
    const feito = await naRota(() => salvarConfiguracoesDaArea(contexto, { config }));
    return { dados: { configuracoes: configuracoesParaOAssistente(feito.config) }, resumo: `Mudou as configurações dos produtos digitais (${carga.mudancas.join(", ")})` };
  },
};

export const FERRAMENTAS_DA_AREA_DIGITAL: Ferramenta[] = [verAreaDigital, verConfiguracoesDigitais, alterarConfiguracoesDigitais] as Ferramenta[];
