/**
 * UTM builder canônico Six Hype (Sprint K).
 *
 * Padrão: toda peça publicada gera link com UTM auto-tagueado pra atribuir
 * origem no Clint/CE. Convenção:
 *   utm_source   = "hype"                     (origem fixa: Six Hype)
 *   utm_medium   = canal de publicação        (instagram_publico, tiktok, ...)
 *   utm_campaign = campanhaId (slug-fied)     ou "avulso" se sem campanha
 *   utm_content  = packId                     pra identificar a peça
 *   utm_term     = etapaFunil                 (tofu/mofu/bofu/pos)
 *
 * Use casos:
 *  - Link bio Instagram → wa.me com pré-preenchido
 *  - "Clique no link da bio" CTA → utm_medium=instagram_publico
 *  - Anúncio Meta → utm_medium=meta_ads
 *
 * Reverso: workflow n8n no Clint lê os utm_* do form e grava
 * lead.origem_peca = utm_content + lead.origem_campanha = utm_campaign.
 */

import type { CanalPublicacao } from '../compliance/cfm';

export interface UtmInput {
  baseUrl: string;                    // ex: "https://wa.me/5511999999999"
  canal: CanalPublicacao;
  campanhaId?: string;
  campanhaNome?: string;              // só pra debug — não vai na URL
  packId: string;
  etapaFunil?: 'tofu' | 'mofu' | 'bofu' | 'pos';
  mensagemPrePreenchida?: string;     // p/ wa.me?text=...
}

export interface UtmOutput {
  url: string;
  utm: {
    utm_source: string;
    utm_medium: string;
    utm_campaign: string;
    utm_content: string;
    utm_term?: string;
  };
}

const UTM_SOURCE = 'hype';

export function buildUtm(input: UtmInput): UtmOutput {
  const utm = {
    utm_source: UTM_SOURCE,
    utm_medium: input.canal,
    utm_campaign: slugifyId(input.campanhaId) || 'avulso',
    utm_content: slugifyId(input.packId) || 'sem-id',
    utm_term: input.etapaFunil,
  };

  let url: URL;
  try {
    url = new URL(input.baseUrl);
  } catch {
    throw new Error(`URL inválida: ${input.baseUrl}`);
  }

  // wa.me pre-preenchido (campo text) — preserva mensagem se já existir
  if (input.mensagemPrePreenchida) {
    const existing = url.searchParams.get('text');
    if (!existing) url.searchParams.set('text', input.mensagemPrePreenchida);
  }

  url.searchParams.set('utm_source', utm.utm_source);
  url.searchParams.set('utm_medium', utm.utm_medium);
  url.searchParams.set('utm_campaign', utm.utm_campaign);
  url.searchParams.set('utm_content', utm.utm_content);
  if (utm.utm_term) url.searchParams.set('utm_term', utm.utm_term);

  return { url: url.toString(), utm };
}

function slugifyId(id?: string): string {
  if (!id) return '';
  return id
    .toLowerCase()
    .normalize('NFD')
    .replace(/[̀-ͯ]/g, '')
    .replace(/[^a-z0-9-]+/g, '-')
    .replace(/^-|-$/g, '');
}

/**
 * Mensagens default pra WhatsApp pre-preenchido, por etapa de funil.
 * Usar como base + ajustar pro tema da peça.
 */
export const DEFAULT_WA_MESSAGES: Record<NonNullable<UtmInput['etapaFunil']>, string> = {
  tofu: 'Oi! Vi o conteúdo de vocês e gostaria de saber mais sobre a Six.',
  mofu: 'Oi! Tenho interesse no tema do conteúdo de vocês. Pode me explicar como funciona?',
  bofu: 'Oi! Quero agendar uma avaliação na Six.',
  pos:  'Oi! Sou paciente da Six e tenho uma dúvida sobre o pós-procedimento.',
};

/**
 * Default WhatsApp Six (futuro: vem de config). Por ora hardcoded com
 * placeholder neutro — usuário configura em Integrações.
 */
export const SIX_WHATSAPP_DEFAULT = 'https://wa.me/5511999999999';
