/**
 * Compliance engine CFM 2.336/2023 + LGPD para conteúdo médico/estético.
 *
 * Sprint H — Six Hype. Centraliza regras antes de publicar/exportar peça.
 * Não bloqueia geração — bloqueia EXPORT/PUBLICAÇÃO. Geração é exploratória;
 * publicação é regulamentada.
 *
 * Regras implementadas (2026-05-25):
 *  R1. Personagem categoria='medico' + peça em canal aberto → exige disclaimer
 *      "Resultados podem variar. Consulte seu médico." + CRM no card final.
 *  R2. Antes/depois em rede aberta (Instagram público, TikTok, Facebook) → BLOQUEIO
 *      (CFM 2.336/2023 art. 13 §1º).
 *  R3. Personagem categoria='cliente' OU 'permuta' sem consentImagemUntil válido
 *      → BLOQUEIO de uso de imagem do personagem.
 *  R4. Restricoes do personagem preenchidas → AVISO sempre.
 *  R5. Promoção comercial de procedimento médico (preço/desconto) com personagem
 *      categoria='medico' → BLOQUEIO (CFM 2.336/2023 art. 4º).
 *
 * Não cobre (futuro): copy automática de disclaimer, validação semântica do hook,
 * análise de imagem (antes/depois detectado por CV).
 */

import type { Personagem } from '~/src/store/useAppStore';

export type CanalPublicacao =
  | 'instagram_publico'
  | 'instagram_close_friends'
  | 'tiktok'
  | 'facebook'
  | 'youtube'
  | 'whatsapp_status'
  | 'whatsapp_lista'
  | 'site_proprio'
  | 'email_optin'
  | 'meta_ads'
  | 'google_ads';

export const CANAIS_ABERTOS: CanalPublicacao[] = [
  'instagram_publico',
  'tiktok',
  'facebook',
  'youtube',
  'site_proprio',
  'meta_ads',
  'google_ads',
];

export interface ComplianceInput {
  personagemPrincipal?: Personagem | null;
  personagensSecundarios?: Personagem[];
  canal: CanalPublicacao;
  temAntesDepois?: boolean;
  temPromocaoComercial?: boolean;  // copy menciona preço, desconto, "promoção"
  disclaimerInserido?: boolean;
  crmNoCardFinal?: boolean;
}

export type ComplianceSeveridade = 'aviso' | 'bloqueio';

export interface ComplianceFinding {
  regra: string;             // ID da regra (R1..R5)
  severidade: ComplianceSeveridade;
  mensagem: string;
  fonte: string;             // fundamento legal
  acaoSugerida?: string;
}

export interface ComplianceResult {
  ok: boolean;
  bloqueios: ComplianceFinding[];
  avisos: ComplianceFinding[];
}

const FONTE_CFM = 'CFM 2.336/2023';
const FONTE_LGPD = 'LGPD art. 11 + art. 14';

export function validateContent(input: ComplianceInput): ComplianceResult {
  const bloqueios: ComplianceFinding[] = [];
  const avisos: ComplianceFinding[] = [];

  const principal = input.personagemPrincipal;
  const todos = [
    ...(principal ? [principal] : []),
    ...(input.personagensSecundarios || []),
  ];
  const ehAberto = CANAIS_ABERTOS.includes(input.canal);
  const temMedico = todos.some((p) => p.categoria === 'medico');

  // R1 — Disclaimer obrigatório p/ médico em canal aberto
  if (temMedico && ehAberto) {
    if (!input.disclaimerInserido) {
      bloqueios.push({
        regra: 'R1',
        severidade: 'bloqueio',
        mensagem: 'Peça com personagem médico em canal aberto exige disclaimer "Resultados podem variar. Consulte seu médico."',
        fonte: `${FONTE_CFM} art. 13`,
        acaoSugerida: 'Inserir disclaimer no card final ou no fim da legenda.',
      });
    }
    const medico = todos.find((p) => p.categoria === 'medico');
    if (medico && !medico.crm) {
      bloqueios.push({
        regra: 'R1',
        severidade: 'bloqueio',
        mensagem: `Personagem médico "${medico.nome}" sem CRM cadastrado. CRM é obrigatório no card final.`,
        fonte: `${FONTE_CFM} art. 6º`,
        acaoSugerida: `Cadastrar CRM em Configurações → Personagens → ${medico.nome}.`,
      });
    } else if (medico && !input.crmNoCardFinal) {
      avisos.push({
        regra: 'R1',
        severidade: 'aviso',
        mensagem: `CRM "${medico.crm}" precisa aparecer no card final da peça.`,
        fonte: `${FONTE_CFM} art. 6º`,
      });
    }
  }

  // R2 — Antes/depois em canal aberto: BLOQUEIO
  if (input.temAntesDepois && ehAberto) {
    bloqueios.push({
      regra: 'R2',
      severidade: 'bloqueio',
      mensagem: `Veiculação de imagens "antes e depois" em ${labelCanal(input.canal)} é vedada pelo CFM.`,
      fonte: `${FONTE_CFM} art. 13 §1º`,
      acaoSugerida: 'Mover pra canal fechado (close friends / WhatsApp lista) ou remover antes/depois.',
    });
  }

  // R3 — Uso de imagem de cliente/permuta sem consentimento válido
  todos.forEach((p) => {
    if (p.categoria !== 'cliente' && p.categoria !== 'permuta') return;
    if (!p.consentImagemUntil) {
      bloqueios.push({
        regra: 'R3',
        severidade: 'bloqueio',
        mensagem: `Personagem "${p.nome}" (${p.categoria}) sem termo de consentimento de imagem cadastrado.`,
        fonte: FONTE_LGPD,
        acaoSugerida: `Cadastrar data de validade do consentimento em Personagens → ${p.nome}.`,
      });
      return;
    }
    const exp = new Date(p.consentImagemUntil);
    if (isFinite(exp.getTime()) && exp < new Date()) {
      bloqueios.push({
        regra: 'R3',
        severidade: 'bloqueio',
        mensagem: `Consentimento de imagem de "${p.nome}" expirou em ${exp.toLocaleDateString('pt-BR')}.`,
        fonte: FONTE_LGPD,
        acaoSugerida: 'Renovar termo + atualizar data em Personagens.',
      });
    }
  });

  // R4 — Restricoes do personagem
  todos.forEach((p) => {
    if (p.restricoes && p.restricoes.trim()) {
      avisos.push({
        regra: 'R4',
        severidade: 'aviso',
        mensagem: `Restrição de "${p.nome}": ${p.restricoes}`,
        fonte: 'cadastro do personagem',
      });
    }
  });

  // R5 — Promoção comercial com médico
  if (input.temPromocaoComercial && temMedico) {
    bloqueios.push({
      regra: 'R5',
      severidade: 'bloqueio',
      mensagem: 'Promoção comercial (preço, desconto) de procedimento médico é vedada pelo CFM.',
      fonte: `${FONTE_CFM} art. 4º`,
      acaoSugerida: 'Remover menção a preço/desconto OU trocar personagem médico por categoria não-médica.',
    });
  }

  return {
    ok: bloqueios.length === 0,
    bloqueios,
    avisos,
  };
}

function labelCanal(c: CanalPublicacao): string {
  const labels: Record<CanalPublicacao, string> = {
    instagram_publico: 'Instagram público',
    instagram_close_friends: 'Instagram Close Friends',
    tiktok: 'TikTok',
    facebook: 'Facebook',
    youtube: 'YouTube',
    whatsapp_status: 'WhatsApp Status',
    whatsapp_lista: 'WhatsApp Lista',
    site_proprio: 'site próprio',
    email_optin: 'e-mail opt-in',
    meta_ads: 'Meta Ads',
    google_ads: 'Google Ads',
  };
  return labels[c] || c;
}

export const CANAL_LABELS: Record<CanalPublicacao, string> = {
  instagram_publico: 'Instagram (público)',
  instagram_close_friends: 'Instagram (Close Friends)',
  tiktok: 'TikTok',
  facebook: 'Facebook',
  youtube: 'YouTube',
  whatsapp_status: 'WhatsApp Status',
  whatsapp_lista: 'WhatsApp Lista',
  site_proprio: 'Site próprio',
  email_optin: 'E-mail (opt-in)',
  meta_ads: 'Meta Ads',
  google_ads: 'Google Ads',
};
