/*
 * O pedaço das Configurações dos produtos digitais (digital_settings.config)
 * que a loja usa: a cara da área de membros, o prazo padrão do acesso, o
 * botão do WhatsApp na compra aprovada, o player e os comentários. O leitor
 * completo mora no painel (apps/admin/src/lib/digitais/configuracoes.ts); os
 * padrões são os mesmos.
 */

import { lerAparencia, type AparenciaGuardada } from "./aparencia.ts";

export type AjustesDoPlayer = {
  /* Volta no segundo em que parou. */
  continuar: boolean;
  /* A aula vira "assistida" ao chegar nesta porcentagem. */
  percentualAssistida: number;
  velocidades: number[];
  /* Ao acabar, a próxima aula começa sozinha. */
  proximaSozinha: boolean;
};

export type AjustesDaLoja = {
  /* fonte, fundo e capas: a aparência escolhida em Configurações (aparencia.ts). */
  area: { nome: string | null; aparencia: "escura" | "clara"; cor: string | null; banner: string | null } & AparenciaGuardada;
  prazoDias: number | null;
  botaoWhatsapp: boolean;
  player: AjustesDoPlayer;
  /* "aprovacao": o comentário do aluno só aparece depois que a loja aprova.
     "avisar": a equipe recebe no celular a cada comentário novo. */
  comentarios: { quando: "na_hora" | "aprovacao"; avisar: boolean };
  /* O certificado ao concluir (cada curso ainda pode desligar o seu). */
  certificado: { emitir: boolean; assinatura: string | null };
  /* Acesso e segurança: aparelhos assistindo juntos, o freio de
     compartilhamento (lugares diferentes em 24 h; null desligado) e a marca
     d'água com o e-mail do aluno. */
  protecao: { aparelhos: number; freioLugares: number | null; marcaDagua: boolean };
};

const VELOCIDADES_POSSIVEIS = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];

function objeto(valor: unknown): Record<string, unknown> {
  return valor && typeof valor === "object" && !Array.isArray(valor) ? (valor as Record<string, unknown>) : {};
}

function textoOuNulo(valor: unknown, teto: number): string | null {
  if (typeof valor !== "string") return null;
  const limpo = valor.replace(/\u0000/g, "").trim();
  return limpo ? limpo.slice(0, teto) : null;
}

export function lerAjustesDaLoja(bruto: unknown): AjustesDaLoja {
  const raiz = objeto(bruto);
  const area = objeto(raiz.area);
  const entrega = objeto(raiz.entrega);
  const acesso = objeto(raiz.acesso);
  const player = objeto(raiz.player);
  const comentarios = objeto(raiz.comentarios);
  const certificado = objeto(raiz.certificado);
  const aparelhos = Number(acesso.aparelhos);
  const freio = acesso.freioLugares === null ? null : Number(acesso.freioLugares ?? 5);
  const cor = typeof area.cor === "string" && /^#[0-9a-fA-F]{6}$/.test(area.cor.trim()) ? area.cor.trim().toUpperCase() : null;
  let banner: string | null = null;
  const bannerBruto = textoOuNulo(area.banner, 1000);
  if (bannerBruto) {
    try {
      banner = new URL(bannerBruto).protocol === "https:" ? bannerBruto : null;
    } catch {
      banner = null;
    }
  }
  const prazo = acesso.prazoDias;
  const percentual = Number(player.percentualAssistida);
  const velocidades = Array.isArray(player.velocidades)
    ? VELOCIDADES_POSSIVEIS.filter((v) => (player.velocidades as unknown[]).some((x) => Number(x) === v))
    : [0.75, 1, 1.25, 1.5, 2];
  return {
    area: { nome: textoOuNulo(area.nome, 60), aparencia: area.aparencia === "clara" ? "clara" : "escura", cor, banner, ...lerAparencia(area) },
    prazoDias: typeof prazo === "number" && Number.isFinite(prazo) && prazo >= 1 ? Math.min(3650, Math.round(prazo)) : null,
    botaoWhatsapp: typeof entrega.botaoWhatsapp === "boolean" ? entrega.botaoWhatsapp : true,
    player: {
      continuar: typeof player.continuar === "boolean" ? player.continuar : true,
      percentualAssistida: Number.isFinite(percentual) ? Math.min(100, Math.max(50, Math.round(percentual))) : 90,
      velocidades: velocidades.length ? (velocidades.includes(1) ? velocidades : [...velocidades, 1].sort((a, b) => a - b)) : [1],
      proximaSozinha: typeof player.proximaSozinha === "boolean" ? player.proximaSozinha : true,
    },
    comentarios: {
      quando: comentarios.quando === "aprovacao" ? "aprovacao" : "na_hora",
      avisar: typeof comentarios.avisar === "boolean" ? comentarios.avisar : true,
    },
    certificado: {
      emitir: typeof certificado.emitir === "boolean" ? certificado.emitir : true,
      assinatura: textoOuNulo(certificado.assinatura, 80),
    },
    protecao: {
      aparelhos: Number.isFinite(aparelhos) && aparelhos >= 1 ? Math.min(10, Math.round(aparelhos)) : 2,
      freioLugares: freio === null ? null : Number.isFinite(freio) ? Math.min(50, Math.max(2, Math.round(freio))) : 5,
      marcaDagua: typeof acesso.marcaDagua === "boolean" ? acesso.marcaDagua : false,
    },
  };
}
