/* ─── Mock Data + Utilities (window-scoped) ─────────────────── */

const now = Date.now();
const hours = (h) => new Date(now - h * 3600000);
const days = (d) => new Date(now - d * 86400000);

const CAT_META = {
  all:         { label: "Todos",        color: "#1A56DB", icon: "radar" },
  competitors: { label: "Concorrentes", color: "#C8231E", icon: "swords" },
  launches:    { label: "Lançamentos",  color: "#EC4899", icon: "rocket" },
  market:      { label: "Mercado",      color: "#2563EB", icon: "trending" },
  vertical:    { label: "Vertical",     color: "#057A55", icon: "briefcase" }, // overridden per workspace
  eventos:     { label: "Eventos",      color: "#B45309", icon: "calendar" },
  tech:        { label: "Tech & IA",    color: "#7C3AED", icon: "cpu" },
  regulatory:  { label: "Regulatório",  color: "#0891B2", icon: "gavel" }
};

const FEATURE_AREAS = [
  { id: "ai",            label: "IA & Agentes",       color: "#7C3AED" },
  { id: "pricing",       label: "Pricing & Planos",   color: "#10B981" },
  { id: "mobile",        label: "Mobile",             color: "#0EA5E9" },
  { id: "api",           label: "API & Integrações",  color: "#F59E0B" },
  { id: "ux",            label: "UX & Onboarding",    color: "#EC4899" },
  { id: "performance",   label: "Performance",        color: "#0891B2" },
  { id: "security",      label: "Segurança",          color: "#EF4444" },
  { id: "analytics",     label: "Analytics & BI",     color: "#1A56DB" },
  { id: "compliance",    label: "Compliance",         color: "#6B7280" }
];

/* ─── Workspaces ─────────────────────────────────────────────── */
const WORKSPACES = [
  {
    id: "ws-rh",
    name: "Refatorando RH",
    niche: "Educação Corporativa & L&D",
    description: "Discovery para o produto de plataforma de aprendizado corporativo B2B no Brasil.",
    color: "#1A56DB",
    gradient: "linear-gradient(135deg, #1A56DB 0%, #0B3FAE 100%)",
    initials: "RH",
    categoryOverrides: { vertical: { label: "Portais RH", color: "#057A55", icon: "briefcase" } },
    members: 6,
    plan: "Pro"
  },
  {
    id: "ws-fintech",
    name: "Stark Pagamentos",
    niche: "Fintech B2B · Pagamentos & Open Finance",
    description: "Inteligência competitiva para PSP de pagamentos B2B e infraestrutura financeira.",
    color: "#7C3AED",
    gradient: "linear-gradient(135deg, #7C3AED 0%, #5B21B6 100%)",
    initials: "SP",
    categoryOverrides: { vertical: { label: "Open Finance", color: "#7C3AED", icon: "code" } },
    members: 4,
    plan: "Pro"
  },
  {
    id: "ws-saude",
    name: "Vita Saúde",
    niche: "Healthtech · Telemedicina B2B2C",
    description: "Radar para mercado de saúde digital, planos corporativos e regulação ANS.",
    color: "#10B981",
    gradient: "linear-gradient(135deg, #10B981 0%, #047857 100%)",
    initials: "VS",
    categoryOverrides: { vertical: { label: "Operadoras", color: "#10B981", icon: "briefcase" }, regulatory: { label: "ANS & Anvisa", color: "#0891B2", icon: "gavel" } },
    members: 3,
    plan: "Starter"
  }
];


const SOURCE_CATALOG = [
  { id: "google-news", name: "Google News",  sub: "Notícias web",       color: "#4285F4", initials: "G" },
  { id: "linkedin",    name: "LinkedIn",     sub: "Posts & empresas",   color: "#0A66C2", initials: "in" },
  { id: "twitter",     name: "X / Twitter",  sub: "Posts em tempo real",color: "#0F172A", initials: "X" },
  { id: "reddit",      name: "Reddit",       sub: "r/learnops, r/HR",   color: "#FF4500", initials: "r" },
  { id: "crunchbase",  name: "Crunchbase",   sub: "Funding & companies",color: "#146AFF", initials: "Cb" },
  { id: "semrush",     name: "SEMrush",      sub: "SEO competitors",    color: "#FF642D", initials: "Sm" },
  { id: "eventbrite",  name: "Eventbrite",   sub: "Eventos & summits",  color: "#F05537", initials: "Eb" },
  { id: "producthunt", name: "Product Hunt", sub: "Lançamentos",        color: "#DA552F", initials: "Ph" },
  { id: "github",      name: "GitHub",       sub: "Repos & releases",   color: "#181717", initials: "Gh" },
  { id: "rss",         name: "RSS Feeds",    sub: "URLs customizadas",  color: "#FF6D00", initials: "Rs" },
  { id: "g2",          name: "G2 Reviews",   sub: "Reviews de B2B",     color: "#FF492C", initials: "G2" },
  { id: "gartner",     name: "Gartner",      sub: "Reports & insights", color: "#E76F00", initials: "Gt" },
  { id: "custom-api",  name: "API Customizada", sub: "Webhook / REST",  color: "#1A56DB", initials: "{}" }
];

const MOCK_INSIGHTS = [
  {
    id: 1,
    workspaceId: "ws-rh",
    title: "Alura anuncia integração de IA para personalização de cursos em tempo real",
    description: "Alura lançou nova funcionalidade que usa modelos generativos para personalizar recomendações de trilhas com base em histórico, progresso e gaps de competência identificados em projetos práticos.",
    source: "Google News", sourceColor: "#4285F4",
    category: "competitors",
    competitor: "Alura",
    relevance: 92,
    impact: "high",
    publishedAt: hours(2), fetchedAt: hours(2),
    url: "https://google.com",
    isNew: true,
    triggerId: "trig-001",
    triggerName: "IA em LXP",
    tags: ["IA", "LXP", "Personalization", "Alura"],
    mentions: 7, trend: 45,
    sources: [
      { name: "Google News", url: "news.google.com/articles/..."},
      { name: "TechCrunch", url: "techcrunch.com/2026/05/alura-ai..." },
      { name: "LinkedIn", url: "linkedin.com/posts/alura-..." }
    ],
    summary: "Alura passa a usar Claude e GPT-4.1 para mapear competências dos alunos em tempo real durante a execução de projetos. A recomendação de próximos cursos é refeita a cada submissão, e o sistema sugere trilhas individualizadas. Lançamento foi anunciado em evento privado para clientes corporativos e deve chegar a clientes free em julho."
  },
  {
    id: 2,
    workspaceId: "ws-rh",
    title: "Cornerstone OnDemand lança marketplace global de integrações nativas",
    description: "Marketplace dará suporte a HRIS, ATS e ferramentas de talent. Mais de 80 parceiros já no lançamento — incluindo Workday, BambooHR e Greenhouse.",
    source: "LinkedIn", sourceColor: "#0A66C2",
    category: "competitors",
    competitor: "Cornerstone",
    relevance: 78, impact: "med",
    publishedAt: hours(4), fetchedAt: hours(4),
    url: "https://linkedin.com", isNew: true,
    triggerId: "trig-001", triggerName: "IA em LXP",
    tags: ["Marketplace", "HRIS", "Cornerstone"],
    mentions: 3, trend: 12,
    sources: [{ name: "LinkedIn", url: "linkedin.com/posts/cornerstone-..." }],
    summary: "Cornerstone abre marketplace de integrações para padronizar conexões com HRIS e ATS. Estratégia mira diferenciação contra Docebo e SAP SuccessFactors."
  },
  {
    id: 3,
    workspaceId: "ws-rh",
    title: "Tendência: IA em RH cresce 45% em menções no mercado global",
    description: "Análise de 47 artigos e 12 posts do LinkedIn mostra: 89% das novas funcionalidades de LXP anunciadas em Q1/2026 incluem alguma forma de IA — contra 41% em Q1/2025.",
    source: "Gartner", sourceColor: "#E76F00",
    category: "market",
    relevance: 88, impact: "high",
    publishedAt: hours(8), fetchedAt: hours(8),
    url: "https://gartner.com", isNew: true,
    triggerId: "trig-003", triggerName: "Mercado LXP 2026",
    tags: ["IA", "LXP", "Tendência", "Gartner"],
    mentions: 12, trend: 45,
    sources: [
      { name: "Gartner Report", url: "gartner.com/doc/lxp-2026" },
      { name: "Forbes", url: "forbes.com/2026/05/lxp-ai-explosion" }
    ],
    summary: "Gartner identifica três fatores de aceleração: queda no custo de tokens (-72% YoY), surgimento de modelos open-source competitivos, e maturidade dos use-cases. Risco: commoditização de features básicas."
  },
  {
    id: 4,
    workspaceId: "ws-rh",
    title: "Vagas: Senior Product Manager de IA em LXP — Coursera",
    description: "Coursera contratando PM Senior dedicado a features de IA na plataforma LXP. Salário base US$ 215k-265k + equity. Remoto-friendly nos EUA e LATAM.",
    source: "LinkedIn Jobs", sourceColor: "#0A66C2",
    category: "vertical",
    competitor: "Coursera",
    relevance: 71, impact: "med",
    publishedAt: hours(14), fetchedAt: hours(14),
    url: "https://linkedin.com/jobs", isNew: true,
    triggerId: "trig-002", triggerName: "Movimentação de Talentos",
    tags: ["Coursera", "Hiring", "PM IA"],
    mentions: 2, trend: 8,
    sources: [{ name: "LinkedIn Jobs", url: "linkedin.com/jobs/coursera-pm-ai" }],
    summary: "Coursera estrutura time dedicado a IA, sinal claro de investimento estratégico. Job description menciona 'agentic AI workflows' e 'competency-based assessment'."
  },
  {
    id: 5,
    workspaceId: "ws-rh",
    title: "Edge Summit 2026 anuncia track 'AI in Corporate Learning' com 12 palestrantes",
    description: "Edge 2026 acontecerá em São Paulo (set/26) e terá track dedicada a IA em educação corporativa. Confirmados: Andrej Karpathy, Reid Hoffman, e CEOs de Docebo, Alura e Coursera.",
    source: "Eventbrite", sourceColor: "#F05537",
    category: "eventos",
    relevance: 65, impact: "med",
    publishedAt: days(1), fetchedAt: days(1),
    url: "https://eventbrite.com",
    isNew: false,
    triggerId: "trig-004", triggerName: "Eventos LATAM 2026",
    tags: ["Edge", "São Paulo", "Karpathy"],
    mentions: 4, trend: 18,
    sources: [{ name: "Eventbrite", url: "eventbrite.com/edge-2026" }],
    summary: "Evento de referência da indústria de Learning. Ingressos corporate variam de R$ 4.8k a R$ 12k. Refatorando pode ter stand e workshop dedicado se confirmar até jun/26."
  },
  {
    id: 6,
    workspaceId: "ws-rh",
    title: "Docebo levanta US$ 180M em Series D para acelerar produto de IA",
    description: "Round liderado pela Sequoia, valuation pós-money de US$ 2.1B. Recursos serão usados para acquihires e expansão para LATAM — em especial Brasil e México.",
    source: "Crunchbase", sourceColor: "#146AFF",
    category: "competitors",
    competitor: "Docebo",
    relevance: 95, impact: "high",
    publishedAt: days(1), fetchedAt: days(1),
    url: "https://crunchbase.com",
    isNew: true,
    triggerId: "trig-001", triggerName: "IA em LXP",
    tags: ["Docebo", "Funding", "Sequoia", "LATAM"],
    mentions: 18, trend: 92,
    sources: [
      { name: "Crunchbase", url: "crunchbase.com/funding/docebo-series-d"},
      { name: "TechCrunch", url: "techcrunch.com/docebo-180m" },
      { name: "Valor Econômico", url: "valor.globo.com/docebo-brasil" }
    ],
    summary: "Sinal forte de movimentação competitiva no Brasil. Sequoia raramente lidera Series D em ed-tech B2B — gesto de confiança. Refatorando deve preparar resposta de posicionamento."
  },
  {
    id: 7,
    workspaceId: "ws-rh",
    title: "Nova regulamentação da LGPD afeta processamento de dados de aprendizado",
    description: "ANPD publicou guia técnico (TGT-04/2026) que detalha como plataformas de educação corporativa devem tratar dados de progresso, avaliações e logs de uso. Prazo: 90 dias.",
    source: "ANPD", sourceColor: "#0891B2",
    category: "regulatory",
    relevance: 84, impact: "high",
    publishedAt: days(2), fetchedAt: days(2),
    url: "https://gov.br/anpd", isNew: false,
    triggerId: "trig-005", triggerName: "Regulatório LGPD/IA",
    tags: ["LGPD", "ANPD", "Compliance"],
    mentions: 5, trend: 22,
    sources: [{ name: "ANPD Oficial", url: "gov.br/anpd/tgt-04-2026" }],
    summary: "Guia técnico cria obrigações claras: minimização, prazo de retenção (24m máx), e direito à explicação algorítmica. Custo de compliance estimado em R$ 80k–R$ 200k para times médios."
  },
  {
    id: 8,
    workspaceId: "ws-rh",
    title: "Microsoft Learn integra Copilot Studio em trilhas de aprendizado interno",
    description: "Microsoft anunciou que o Microsoft Learn passa a usar Copilot Studio para gerar trilhas personalizadas em tempo real. Lançamento para tenants Enterprise em junho.",
    source: "Microsoft Blog", sourceColor: "#2563EB",
    category: "tech",
    relevance: 73, impact: "med",
    publishedAt: days(2), fetchedAt: days(2),
    url: "https://microsoft.com", isNew: false,
    triggerId: "trig-006", triggerName: "Big Tech & Learning",
    tags: ["Microsoft", "Copilot", "Agentic AI"],
    mentions: 9, trend: 28,
    sources: [{ name: "Microsoft Blog", url: "microsoft.com/blog/learn-copilot" }],
    summary: "Microsoft transformando Learn em arma de tração para Copilot. Estratégia: usuários aprendem na plataforma e adotam a stack Microsoft. Risco competitivo: aumenta switching cost."
  },
  {
    id: 9,
    workspaceId: "ws-rh",
    title: "Udemy Business reporta queda de 8% em NRR — primeiro tropeço em 3 anos",
    description: "Resultados Q1 mostram NRR caiu de 112% para 104%. Empresa cita 'consolidação de fornecedores' por parte de clientes enterprise como principal driver.",
    source: "Bloomberg", sourceColor: "#0F172A",
    category: "competitors",
    competitor: "Udemy",
    relevance: 81, impact: "med",
    publishedAt: days(3), fetchedAt: days(3),
    url: "https://bloomberg.com", isNew: false,
    triggerId: "trig-001", triggerName: "IA em LXP",
    tags: ["Udemy", "NRR", "Q1"],
    mentions: 6, trend: -18,
    sources: [{ name: "Bloomberg", url: "bloomberg.com/udemy-q1-2026" }],
    summary: "Oportunidade competitiva. Clientes Udemy podem estar abertos a novos vendors. Refatorando pode rodar campanha targeted em accounts de SMB/Mid-market que historicamente usaram Udemy."
  },
  {
    id: 10,
    workspaceId: "ws-rh",
    title: "Spotify lança benefício educacional pago para 9.000 funcionários globais",
    description: "Programa cobre 100% de custos de cursos de IA, dados, leadership e idiomas, com orçamento de US$ 3k/funcionário/ano. Parceiros: Coursera, edX e Refatorando (LATAM).",
    source: "LinkedIn", sourceColor: "#0A66C2",
    category: "vertical",
    relevance: 96, impact: "high",
    publishedAt: days(3), fetchedAt: days(3),
    url: "https://linkedin.com", isNew: false,
    triggerId: "trig-007", triggerName: "Mentions: Refatorando",
    tags: ["Spotify", "L&D", "Refatorando", "Win"],
    mentions: 24, trend: 156,
    sources: [
      { name: "LinkedIn", url: "linkedin.com/posts/spotify-ld-2026" },
      { name: "Folha SP", url: "folha.uol.com.br/spotify-educacao" }
    ],
    summary: "🏆 Mention positiva — Refatorando é citada nominalmente como parceira LATAM. Ativar para case study, social proof e selo no site institucional."
  }
];

const MOCK_TRIGGERS = [
  {
    id: "trig-001",
    workspaceId: "ws-rh",
    name: "IA em LXP",
    description: "Movimentações de concorrentes diretos no eixo IA + personalização para LXP B2B.",
    category: "competitors",
    competitors: ["Alura", "Coursera", "Docebo", "Cornerstone", "Udemy"],
    keywords: ["AI-powered learning", "LXP", "competency mapping", "personalization", "adaptive learning"],
    excludeKeywords: ["bootcamp infantil", "kids"],
    domains: ["techcrunch.com", "venturebeat.com", "valor.globo.com"],
    languages: ["pt-BR", "en-US"],
    geo: "global",
    sources: ["google-news", "linkedin", "crunchbase", "techcrunch-rss"],
    frequency: "daily",
    runTime: "08:00",
    minRelevance: 65,
    alertThreshold: 80,
    notify: { slack: true, email: true, inApp: true },
    aiDepth: "deep",
    autoSummarize: true,
    enabled: true,
    lastRun: hours(2),
    nextRun: hours(-22),
    totalInsights: 142,
    insights24h: 23,
    createdAt: days(34),
    createdBy: "Wilker"
  },
  {
    id: "trig-002",
    workspaceId: "ws-rh",
    name: "Movimentação de Talentos",
    description: "Hiring e demissões em concorrentes — sinal de prioridades estratégicas.",
    category: "competitors",
    competitors: ["Alura", "Coursera", "Docebo", "Cornerstone", "Udemy", "edX"],
    keywords: ["hiring", "VP of", "Head of", "Senior PM", "layoff", "demissão"],
    excludeKeywords: ["estágio"],
    domains: [],
    languages: ["pt-BR", "en-US"],
    geo: "global",
    sources: ["linkedin", "google-news"],
    frequency: "weekly",
    runTime: "09:00",
    minRelevance: 55,
    alertThreshold: 75,
    notify: { slack: true, email: false, inApp: true },
    aiDepth: "balanced",
    autoSummarize: true,
    enabled: true,
    lastRun: days(2), nextRun: days(-5),
    totalInsights: 38, insights24h: 4,
    createdAt: days(20), createdBy: "Wilker"
  },
  {
    id: "trig-003",
    workspaceId: "ws-rh",
    name: "Mercado LXP 2026",
    description: "Relatórios, tendências e análises macro do mercado de Learning Experience Platform.",
    category: "market",
    competitors: [],
    keywords: ["LXP market", "corporate learning", "L&D trends", "future of work", "skills gap"],
    excludeKeywords: [],
    domains: ["gartner.com", "forrester.com", "mckinsey.com", "hbr.org"],
    languages: ["en-US", "pt-BR"],
    geo: "global",
    sources: ["google-news", "gartner", "rss"],
    frequency: "weekly",
    runTime: "10:00",
    minRelevance: 70,
    alertThreshold: 80,
    notify: { slack: false, email: true, inApp: true },
    aiDepth: "deep",
    autoSummarize: true,
    enabled: true,
    lastRun: hours(8), nextRun: days(-6),
    totalInsights: 76, insights24h: 8,
    createdAt: days(40), createdBy: "Wilker"
  },
  {
    id: "trig-004",
    workspaceId: "ws-rh",
    name: "Eventos LATAM 2026",
    description: "Conferências, summits e meetups de educação corporativa e tech HR em LATAM.",
    category: "eventos",
    competitors: [],
    keywords: ["L&D summit", "HR conference", "Learning event", "people analytics conf"],
    excludeKeywords: ["webinar grátis"],
    domains: [],
    languages: ["pt-BR", "es-LA"],
    geo: "latam",
    sources: ["eventbrite", "linkedin", "google-news"],
    frequency: "weekly",
    runTime: "11:00",
    minRelevance: 50,
    alertThreshold: 70,
    notify: { slack: true, email: false, inApp: true },
    aiDepth: "balanced",
    autoSummarize: true,
    enabled: true,
    lastRun: days(1), nextRun: days(-6),
    totalInsights: 22, insights24h: 1,
    createdAt: days(25), createdBy: "Wilker"
  },
  {
    id: "trig-005",
    workspaceId: "ws-rh",
    name: "Regulatório LGPD/IA",
    description: "Atos da ANPD, CADE e novas regulações de IA e dados que afetam ed-tech B2B.",
    category: "regulatory",
    competitors: [],
    keywords: ["LGPD", "ANPD", "regulação IA", "AI Act", "compliance educação"],
    excludeKeywords: [],
    domains: ["gov.br", "anpd.gov.br", "in.gov.br"],
    languages: ["pt-BR"],
    geo: "br",
    sources: ["google-news", "rss", "custom-api"],
    customApis: [
      { id: "api-anpd", name: "ANPD Diário Oficial", url: "https://api.anpd.gov.br/atos", method: "GET", auth: "bearer", jsonPath: "$.atos[*]" }
    ],
    frequency: "daily",
    runTime: "07:00",
    minRelevance: 70,
    alertThreshold: 85,
    notify: { slack: true, email: true, inApp: true },
    aiDepth: "deep",
    autoSummarize: true,
    enabled: true,
    lastRun: days(2), nextRun: hours(-22),
    totalInsights: 14, insights24h: 1,
    createdAt: days(60), createdBy: "Wilker"
  },
  {
    id: "trig-006",
    workspaceId: "ws-rh",
    name: "Big Tech & Learning",
    description: "Movimentos de Microsoft, Google, OpenAI, Anthropic e Meta no espaço de aprendizado.",
    category: "tech",
    competitors: ["Microsoft", "Google", "OpenAI", "Anthropic", "Meta"],
    keywords: ["Copilot", "Gemini", "Claude for education", "agentic learning"],
    excludeKeywords: [],
    domains: [],
    languages: ["en-US"],
    geo: "global",
    sources: ["google-news", "twitter", "producthunt", "github"],
    frequency: "daily",
    runTime: "08:30",
    minRelevance: 60,
    alertThreshold: 78,
    notify: { slack: true, email: false, inApp: true },
    aiDepth: "balanced",
    autoSummarize: true,
    enabled: true,
    lastRun: days(2), nextRun: hours(-22),
    totalInsights: 56, insights24h: 6,
    createdAt: days(28), createdBy: "Wilker"
  },
  {
    id: "trig-007",
    workspaceId: "ws-rh",
    name: "Mentions: Refatorando",
    description: "Toda menção à Refatorando — clientes, imprensa, redes sociais, vagas.",
    category: "market",
    competitors: [],
    keywords: ["Refatorando", "@refatorando", "refatorando.com.br"],
    excludeKeywords: [],
    domains: [],
    languages: ["pt-BR", "en-US"],
    geo: "global",
    sources: ["google-news", "linkedin", "twitter", "reddit", "g2"],
    frequency: "realtime",
    runTime: "—",
    minRelevance: 40,
    alertThreshold: 60,
    notify: { slack: true, email: true, inApp: true },
    aiDepth: "fast",
    autoSummarize: true,
    enabled: true,
    lastRun: hours(1), nextRun: hours(1),
    totalInsights: 89, insights24h: 4,
    createdAt: days(50), createdBy: "Wilker"
  },
  {
    id: "trig-008",
    workspaceId: "ws-rh",
    name: "Conteúdo Viral em L&D",
    description: "Posts virais de creators de L&D no LinkedIn/X — radar de narrativa.",
    category: "tech",
    competitors: [],
    keywords: ["L&D", "people development", "skill-based org", "AI literacy"],
    excludeKeywords: ["motivational"],
    domains: [],
    languages: ["en-US", "pt-BR"],
    geo: "global",
    sources: ["linkedin", "twitter"],
    frequency: "weekly",
    runTime: "—",
    minRelevance: 55,
    alertThreshold: 70,
    notify: { slack: false, email: false, inApp: true },
    aiDepth: "fast",
    autoSummarize: true,
    enabled: false,
    lastRun: days(14), nextRun: null,
    totalInsights: 31, insights24h: 0,
    createdAt: days(70), createdBy: "Wilker"
  }
];

// ─── Utilities ─────────────────────────────────────────────
function relDate(d) {
  if (!d) return "—";
  const dt = (d instanceof Date) ? d : new Date(d);
  const diff = Date.now() - dt.getTime();
  if (diff < 0) {
    const fwd = -diff;
    const min = Math.floor(fwd / 60000);
    const h = Math.floor(fwd / 3600000);
    if (min < 60) return `em ${min}m`;
    if (h < 24) return `em ${h}h`;
    return `em ${Math.floor(fwd / 86400000)}d`;
  }
  const min = Math.floor(diff / 60000);
  const h = Math.floor(diff / 3600000);
  const dd = Math.floor(diff / 86400000);
  if (min < 1) return "agora";
  if (min < 60) return `${min}m atrás`;
  if (h < 24) return `${h}h atrás`;
  if (dd < 7) return `${dd}d atrás`;
  return dt.toLocaleDateString("pt-BR", { day: "2-digit", month: "short" });
}

function relScore(n) {
  if (n >= 80) return "high";
  if (n >= 60) return "med";
  return "low";
}

function sourceById(id) { return SOURCE_CATALOG.find(s => s.id === id); }

const FREQ_LABEL = {
  realtime: "Tempo real",
  daily: "Diário",
  weekly: "Semanal",
  monthly: "Mensal",
  "on-demand": "Sob demanda"
};

const GEO_LABEL = {
  global: "Global",
  br: "Brasil",
  latam: "LATAM",
  us: "Estados Unidos",
  emea: "EMEA",
  apac: "APAC"
};

const AI_DEPTH_LABEL = {
  fast: "Rápido (resumo curto)",
  balanced: "Balanceado (análise)",
  deep: "Profundo (cross-source)"
};

/* ─── Extra workspace data ─────────────────────────────────────────────── */

const WS_FINTECH_TRIGGERS = [
  {
    id: "trig-fin-001",
    workspaceId: "ws-fintech",
    name: "PSPs concorrentes",
    description: "Movimentações de Pagar.me, Iugu, Asaas, Stark Bank e Pagseguro no segmento B2B.",
    category: "competitors",
    competitors: ["Pagar.me", "Iugu", "Asaas", "Stark Bank", "PagSeguro", "Cora"],
    keywords: ["payment processor B2B", "split de pagamento", "marketplace fintech", "PSP"],
    excludeKeywords: ["cartão de crédito pessoal"],
    domains: ["valor.globo.com", "infomoney.com.br", "neofeed.com.br"],
    blockDomains: [],
    languages: ["pt-BR", "en-US"],
    geo: "br",
    sources: ["google-news", "linkedin", "crunchbase", "twitter"],
    customApis: [],
    frequency: "daily", runTime: "08:00",
    minRelevance: 65, alertThreshold: 80,
    notify: { slack: true, email: true, inApp: true },
    aiDepth: "deep", autoSummarize: true, customPrompt: "",
    enabled: true,
    lastRun: hours(3), nextRun: hours(-21),
    totalInsights: 87, insights24h: 11, createdAt: days(22), createdBy: "Wilker"
  },
  {
    id: "trig-fin-002",
    workspaceId: "ws-fintech",
    name: "Open Finance & PIX",
    description: "Atos do BCB, fases do Open Finance e novidades do PIX que afetam o roadmap.",
    category: "regulatory",
    competitors: [],
    keywords: ["Open Finance", "PIX automático", "BCB", "PIX por aproximação", "DREX"],
    excludeKeywords: [],
    domains: ["bcb.gov.br", "in.gov.br"],
    blockDomains: [],
    languages: ["pt-BR"],
    geo: "br",
    sources: ["google-news", "rss", "custom-api"],
    customApis: [{ id: "api-bcb", name: "BCB Comunicados", method: "GET", url: "https://api.bcb.gov.br/comunicados", auth: "none", jsonPath: "$.results[*]" }],
    frequency: "daily", runTime: "07:00",
    minRelevance: 70, alertThreshold: 85,
    notify: { slack: true, email: true, inApp: true },
    aiDepth: "deep", autoSummarize: true, customPrompt: "",
    enabled: true,
    lastRun: hours(5), nextRun: hours(-19),
    totalInsights: 34, insights24h: 3, createdAt: days(40), createdBy: "Wilker"
  },
  {
    id: "trig-fin-003",
    workspaceId: "ws-fintech",
    name: "Funding LATAM Fintech",
    description: "Series A+ em fintechs LATAM — sinais de aquecimento competitivo.",
    category: "market",
    competitors: [],
    keywords: ["fintech funding", "Series A", "Series B", "rodada de investimento", "Sequoia LATAM"],
    excludeKeywords: ["pré-seed"],
    domains: [],
    blockDomains: [],
    languages: ["pt-BR", "en-US", "es-LA"],
    geo: "latam",
    sources: ["crunchbase", "google-news", "linkedin"],
    customApis: [],
    frequency: "weekly", runTime: "09:00",
    minRelevance: 60, alertThreshold: 78,
    notify: { slack: true, email: false, inApp: true },
    aiDepth: "balanced", autoSummarize: true, customPrompt: "",
    enabled: true,
    lastRun: days(2), nextRun: days(-5),
    totalInsights: 28, insights24h: 0, createdAt: days(35), createdBy: "Wilker"
  }
];

const WS_FINTECH_INSIGHTS = [
  {
    id: 101, workspaceId: "ws-fintech",
    title: "Pagar.me anuncia split inteligente com IA para marketplaces de grande porte",
    description: "Nova feature usa modelos preditivos para sugerir distribuição ótima de taxas e antecipação por seller — em soft launch com 12 marketplaces.",
    source: "Valor Econômico", sourceColor: "#0F172A",
    category: "competitors", competitor: "Pagar.me",
    relevance: 89, impact: "high",
    publishedAt: hours(3), fetchedAt: hours(3), url: "https://valor.globo.com", isNew: true,
    triggerId: "trig-fin-001", triggerName: "PSPs concorrentes",
    tags: ["Pagar.me", "Split", "Marketplace", "IA"], mentions: 8, trend: 67,
    sources: [{ name: "Valor", url: "valor.globo.com/pagarme-split-ia" }, { name: "NeoFeed", url: "neofeed.com.br/pagarme" }],
    summary: "Pagar.me passa a usar IA para otimizar splits em marketplaces. Estratégia de retenção de grandes clientes (Mercado Livre, iFood). Sinal forte de pressão sobre players menores."
  },
  {
    id: 102, workspaceId: "ws-fintech",
    title: "BCB publica resolução 425 com regras finais para PIX Automático recorrente",
    description: "Resolução define limites, opt-in, e padrões de UX. Implementação obrigatória até 1º de novembro de 2026 para todos os participantes do PIX.",
    source: "BCB", sourceColor: "#0891B2",
    category: "regulatory", relevance: 94, impact: "high",
    publishedAt: hours(6), fetchedAt: hours(6), url: "https://bcb.gov.br", isNew: true,
    triggerId: "trig-fin-002", triggerName: "Open Finance & PIX",
    tags: ["BCB", "PIX", "Automático", "Regulação"], mentions: 14, trend: 88,
    sources: [{ name: "BCB Oficial", url: "bcb.gov.br/res-425" }, { name: "Folha SP", url: "folha.uol.com.br/pix-automatico" }],
    summary: "Janela curta de implementação. Stark precisa priorizar PIX Automático no Q3. Estimativa preliminar: 6-8 semanas de dev + auditoria BCB."
  },
  {
    id: 103, workspaceId: "ws-fintech",
    title: "Iugu levanta R$ 200M em Series C com Tiger Global e expande para México",
    description: "Round avalia a empresa em R$ 1.8B pós-money. Foco da expansão: e-commerce e SaaS LATAM. Hiring agressivo de eng e produto em São Paulo.",
    source: "Crunchbase", sourceColor: "#146AFF",
    category: "competitors", competitor: "Iugu",
    relevance: 91, impact: "high",
    publishedAt: days(1), fetchedAt: days(1), url: "https://crunchbase.com", isNew: true,
    triggerId: "trig-fin-001", triggerName: "PSPs concorrentes",
    tags: ["Iugu", "Funding", "México", "Tiger"], mentions: 22, trend: 145,
    sources: [{ name: "Crunchbase", url: "crunchbase.com/iugu-series-c" }, { name: "TechCrunch", url: "techcrunch.com/iugu-mexico" }],
    summary: "Round substancial. Iugu se posiciona como player regional, não só BR. Stark deve avaliar acelerar expansão LATAM (México/Colômbia) antes que mercado mature."
  },
  {
    id: 104, workspaceId: "ws-fintech",
    title: "Banco Central confirma piloto Drex em produção limitada até dez/26",
    description: "Após 24 meses de POC, Drex entra em modo de produção controlada. 32 instituições participantes — incluindo bancos médios e fintechs licenciadas.",
    source: "Reuters", sourceColor: "#FF8000",
    category: "vertical", relevance: 82, impact: "med",
    publishedAt: days(2), fetchedAt: days(2), url: "https://reuters.com", isNew: false,
    triggerId: "trig-fin-002", triggerName: "Open Finance & PIX",
    tags: ["Drex", "CBDC", "BCB"], mentions: 9, trend: 35,
    sources: [{ name: "Reuters", url: "reuters.com/drex-2026" }],
    summary: "Drex avança mas ainda em escopo controlado. Janela de 6-12m para Stark se posicionar como participante. Custo de entrada estimado em R$ 1.5–3M."
  },
  {
    id: 105, workspaceId: "ws-fintech",
    title: "Nubank lança API de Banking-as-a-Service para fintechs B2B",
    description: "Nu BaaS abre infraestrutura bancária para fintechs sem licença própria. Pricing baseado em volume de transações + setup R$ 50k.",
    source: "LinkedIn", sourceColor: "#0A66C2",
    category: "tech", competitor: "Nubank",
    relevance: 78, impact: "med",
    publishedAt: days(3), fetchedAt: days(3), url: "https://linkedin.com", isNew: false,
    triggerId: "trig-fin-001", triggerName: "PSPs concorrentes",
    tags: ["Nubank", "BaaS", "API"], mentions: 16, trend: 58,
    sources: [{ name: "LinkedIn", url: "linkedin.com/posts/nubank-baas" }],
    summary: "Nubank entra no jogo de infra B2B. Movimento ofensivo contra Bankly, Dock e Swap. Stark pode considerar partnership ou diferenciação por verticalização."
  }
];

const WS_SAUDE_TRIGGERS = [
  {
    id: "trig-sau-001",
    workspaceId: "ws-saude",
    name: "Operadoras & planos corporativos",
    description: "Reajustes, novos produtos e movimentos das operadoras nos planos empresariais.",
    category: "vertical",
    competitors: ["Amil", "Bradesco Saúde", "SulAmérica", "Hapvida NotreDame", "Porto Saúde"],
    keywords: ["plano corporativo", "saúde suplementar", "reajuste plano", "PME saúde"],
    excludeKeywords: ["plano individual"],
    domains: ["ans.gov.br", "valor.globo.com"],
    blockDomains: [],
    languages: ["pt-BR"],
    geo: "br",
    sources: ["google-news", "linkedin", "rss"],
    customApis: [],
    frequency: "daily", runTime: "08:00",
    minRelevance: 65, alertThreshold: 80,
    notify: { slack: true, email: true, inApp: true },
    aiDepth: "balanced", autoSummarize: true, customPrompt: "",
    enabled: true,
    lastRun: hours(2), nextRun: hours(-22),
    totalInsights: 52, insights24h: 6, createdAt: days(18), createdBy: "Wilker"
  },
  {
    id: "trig-sau-002",
    workspaceId: "ws-saude",
    name: "ANS & Anvisa",
    description: "Resoluções normativas e atos da ANS/Anvisa que afetam telessaúde.",
    category: "regulatory",
    competitors: [],
    keywords: ["ANS resolução", "Anvisa", "telessaúde regulação", "CFM", "prontuário eletrônico"],
    excludeKeywords: [],
    domains: ["ans.gov.br", "anvisa.gov.br", "cfm.org.br", "in.gov.br"],
    blockDomains: [],
    languages: ["pt-BR"],
    geo: "br",
    sources: ["google-news", "rss", "custom-api"],
    customApis: [{ id: "api-ans", name: "ANS Diário", method: "GET", url: "https://api.ans.gov.br/atos", auth: "none", jsonPath: "$.atos[*]" }],
    frequency: "daily", runTime: "07:00",
    minRelevance: 70, alertThreshold: 85,
    notify: { slack: true, email: true, inApp: true },
    aiDepth: "deep", autoSummarize: true, customPrompt: "",
    enabled: true,
    lastRun: hours(4), nextRun: hours(-20),
    totalInsights: 19, insights24h: 2, createdAt: days(28), createdBy: "Wilker"
  }
];

const WS_SAUDE_INSIGHTS = [
  {
    id: 201, workspaceId: "ws-saude",
    title: "Hapvida anuncia plataforma de telemedicina B2B com integração HRIS",
    description: "Solução inclui agendamento via Slack, dashboards de utilização para RH e SLA de 5min para clínica geral.",
    source: "Valor Econômico", sourceColor: "#0F172A",
    category: "competitors", competitor: "Hapvida NotreDame",
    relevance: 88, impact: "high",
    publishedAt: hours(2), fetchedAt: hours(2), url: "https://valor.globo.com", isNew: true,
    triggerId: "trig-sau-001", triggerName: "Operadoras & planos corporativos",
    tags: ["Hapvida", "Telemedicina", "B2B", "HRIS"], mentions: 6, trend: 52,
    sources: [{ name: "Valor", url: "valor.globo.com/hapvida-b2b" }],
    summary: "Hapvida mira segmento que era nicho de healthtechs. Vita precisa diferenciar por UX e velocidade de onboarding."
  },
  {
    id: 202, workspaceId: "ws-saude",
    title: "ANS publica RN 612/2026: regula uso de IA em decisões clínicas em telemedicina",
    description: "Norma exige rastreabilidade, supervisão médica e consentimento explícito quando IA participa de triagem ou diagnóstico.",
    source: "ANS", sourceColor: "#0891B2",
    category: "regulatory", relevance: 93, impact: "high",
    publishedAt: hours(7), fetchedAt: hours(7), url: "https://ans.gov.br", isNew: true,
    triggerId: "trig-sau-002", triggerName: "ANS & Anvisa",
    tags: ["ANS", "IA", "Telessaúde", "Compliance"], mentions: 11, trend: 92,
    sources: [{ name: "ANS Oficial", url: "ans.gov.br/rn-612-2026" }],
    summary: "Janela de 90 dias para adequação. Vita precisa documentar pipeline de IA da triagem, adicionar logs e fluxo de consentimento explícito."
  },
  {
    id: 203, workspaceId: "ws-saude",
    title: "Porto Saúde lança 'Porto Care': benefício de saúde mental para empresas",
    description: "Pacote integra terapia online, mindfulness e check-ins emocionais. Pricing R$ 35/funcionário/mês.",
    source: "LinkedIn", sourceColor: "#0A66C2",
    category: "vertical", competitor: "Porto Saúde",
    relevance: 76, impact: "med",
    publishedAt: days(1), fetchedAt: days(1), url: "https://linkedin.com", isNew: true,
    triggerId: "trig-sau-001", triggerName: "Operadoras & planos corporativos",
    tags: ["Porto", "Saúde mental", "Wellness"], mentions: 4, trend: 28,
    sources: [{ name: "LinkedIn", url: "linkedin.com/posts/porto-saude-care" }],
    summary: "Saúde mental virou segmento competitivo de operadoras tradicionais. Vita pode posicionar produto como complementar ou parceiro."
  },
  {
    id: 204, workspaceId: "ws-saude",
    title: "Anvisa aprova 14 novos prontuários eletrônicos com selo CBHPM-2026",
    description: "Lista atualizada de PEPs autorizados — inclui players brasileiros (MV, Tasy, Vitta) e duas integrações de telemedicina.",
    source: "Anvisa", sourceColor: "#0891B2",
    category: "regulatory", relevance: 71, impact: "med",
    publishedAt: days(2), fetchedAt: days(2), url: "https://anvisa.gov.br", isNew: false,
    triggerId: "trig-sau-002", triggerName: "ANS & Anvisa",
    tags: ["PEP", "Anvisa", "Compliance"], mentions: 3, trend: 12,
    sources: [{ name: "Anvisa", url: "anvisa.gov.br/pep-2026" }],
    summary: "Atualização rotineira mas com impacto: novos PEPs aprovados são potenciais alvos de integração. Avaliar MV e Vitta para parceria."
  }
];

const ALL_INSIGHTS = [...MOCK_INSIGHTS, ...WS_FINTECH_INSIGHTS, ...WS_SAUDE_INSIGHTS];
const ALL_TRIGGERS = [...MOCK_TRIGGERS, ...WS_FINTECH_TRIGGERS, ...WS_SAUDE_TRIGGERS];

/* ─── Product launch triggers + insights (one set per workspace) ─────────────────── */
const LAUNCH_TRIGGER_RH = {
  id: "trig-launch-rh",
  workspaceId: "ws-rh",
  name: "Lançamentos & Features",
  description: "Releases, novas features e produtos lançados pelos concorrentes de LXP.",
  category: "launches",
  competitors: [],
  products: ["Alura LXP", "Coursera for Business", "Docebo", "Cornerstone Learn", "Udemy Business", "LinkedIn Learning"],
  featureAreas: ["ai", "ux", "analytics", "api"],
  keywords: ["launches", "feature release", "now available", "introducing", "ga release"],
  excludeKeywords: ["beta closed"],
  domains: ["producthunt.com", "github.com", "alura.com.br/blog"],
  blockDomains: [],
  changelogUrls: ["https://docebo.com/changelog.rss", "https://blog.coursera.org/feed"],
  languages: ["en-US", "pt-BR"],
  geo: "global",
  sources: ["producthunt", "github", "rss", "linkedin", "google-news"],
  customApis: [],
  frequency: "daily", runTime: "08:30",
  minRelevance: 55, alertThreshold: 75,
  notify: { slack: true, email: false, inApp: true },
  aiDepth: "balanced", autoSummarize: true, customPrompt: "Foque em novos lançamentos GA. Identifique versão/mudança, área (IA, pricing, mobile, etc.) e diferenciais vs. concorrência.",
  enabled: true,
  lastRun: hours(2), nextRun: hours(-22),
  totalInsights: 41, insights24h: 4, createdAt: days(15), createdBy: "Wilker"
};

const LAUNCH_TRIGGER_FIN = {
  id: "trig-launch-fin", workspaceId: "ws-fintech",
  name: "Releases de PSPs",
  description: "Novas features, APIs e produtos dos PSPs concorrentes.",
  category: "launches",
  competitors: [],
  products: ["Pagar.me", "Iugu", "Asaas", "Stark Bank", "Cora", "PagSeguro Yape"],
  featureAreas: ["api", "pricing", "ai", "compliance"],
  keywords: ["lançamento", "nova feature", "API v", "now live"],
  excludeKeywords: [],
  domains: [], blockDomains: [],
  changelogUrls: ["https://docs.pagar.me/changelog.rss", "https://docs.iugu.com/changelog"],
  languages: ["pt-BR", "en-US"], geo: "br",
  sources: ["producthunt", "github", "rss", "linkedin"],
  customApis: [],
  frequency: "daily", runTime: "08:30",
  minRelevance: 55, alertThreshold: 75,
  notify: { slack: true, email: false, inApp: true },
  aiDepth: "balanced", autoSummarize: true, customPrompt: "",
  enabled: true,
  lastRun: hours(3), nextRun: hours(-21),
  totalInsights: 19, insights24h: 2, createdAt: days(12), createdBy: "Wilker"
};

const LAUNCH_TRIGGER_SAU = {
  id: "trig-launch-sau", workspaceId: "ws-saude",
  name: "Releases de Healthtechs",
  description: "Releases de produtos de telessaúde, healthtechs e operadoras com plataforma própria.",
  category: "launches",
  competitors: [],
  products: ["Conexa Saúde", "Dr. Consulta App", "Hapvida B2B", "Amil Saúde Digital", "Vita"],
  featureAreas: ["ai", "ux", "compliance", "mobile"],
  keywords: ["telessaúde", "release", "feature", "app saúde"],
  excludeKeywords: [],
  domains: [], blockDomains: [],
  changelogUrls: [],
  languages: ["pt-BR"], geo: "br",
  sources: ["google-news", "producthunt", "linkedin", "rss"],
  customApis: [],
  frequency: "weekly", runTime: "09:00",
  minRelevance: 55, alertThreshold: 75,
  notify: { slack: true, email: false, inApp: true },
  aiDepth: "balanced", autoSummarize: true, customPrompt: "",
  enabled: true,
  lastRun: days(1), nextRun: days(-6),
  totalInsights: 11, insights24h: 1, createdAt: days(10), createdBy: "Wilker"
};

const LAUNCH_INSIGHTS = [
  // ─── RH ───
  {
    id: 301, workspaceId: "ws-rh",
    title: "Alura LXP lança 'AI Tutor 2.0' com voice + screen sharing em projetos",
    description: "Versão GA do tutor inclui voz natural, compartilhamento de tela e revisão em tempo real. Disponível para tier Business+ a partir de 12 de maio.",
    source: "Product Hunt", sourceColor: "#DA552F",
    category: "launches", competitor: "Alura", product: "Alura LXP",
    version: "AI Tutor 2.0", featureAreas: ["ai", "ux"],
    launchedAt: hours(8),
    relevance: 89, impact: "high",
    publishedAt: hours(8), fetchedAt: hours(8), url: "https://producthunt.com", isNew: true,
    triggerId: "trig-launch-rh", triggerName: "Lançamentos & Features",
    tags: ["Alura", "AI Tutor", "Voice", "GA"], mentions: 14, trend: 78,
    sources: [{ name: "Product Hunt", url: "producthunt.com/alura-ai-tutor-2" }, { name: "Blog Alura", url: "alura.com.br/artigos/ai-tutor-2" }],
    summary: "Alura ataca o gap de mentoria com voice. Diferencial é screen-sharing dentro do tutor — barreira de entrada menor que clones. Refatorando deve avaliar parity ou diferenciar via curadoria humana híbrida."
  },
  {
    id: 302, workspaceId: "ws-rh",
    title: "Coursera for Business adiciona 'Skill Graph' — mapa de competências para times",
    description: "Novo dashboard para People Managers visualizarem gaps e overlap de skills no time. Integrações nativas com Workday e BambooHR.",
    source: "Coursera Blog", sourceColor: "#0A66C2",
    category: "launches", competitor: "Coursera", product: "Coursera for Business",
    version: "Skill Graph 1.0", featureAreas: ["analytics", "api"],
    launchedAt: days(1),
    relevance: 84, impact: "high",
    publishedAt: days(1), fetchedAt: days(1), url: "https://coursera.org", isNew: true,
    triggerId: "trig-launch-rh", triggerName: "Lançamentos & Features",
    tags: ["Coursera", "Skill Graph", "Analytics", "B2B"], mentions: 8, trend: 56,
    sources: [{ name: "Coursera Blog", url: "blog.coursera.org/skill-graph" }],
    summary: "Movimento ofensivo no segmento de manager-level analytics. Refatorando precisa ter resposta clara em People Analytics. Skill Graph é caro de replicar — avaliar partnership ou compra."
  },
  {
    id: 303, workspaceId: "ws-rh",
    title: "Docebo libera GitHub action para sincronizar conteúdo via repo",
    description: "Times de DevRel podem agora publicar trilhas direto de repositórios Markdown. Builds automáticos, preview ambiente staging.",
    source: "GitHub", sourceColor: "#181717",
    category: "launches", competitor: "Docebo", product: "Docebo",
    version: "docebo-sync@2.0", featureAreas: ["api", "ux"],
    launchedAt: days(2),
    relevance: 71, impact: "med",
    publishedAt: days(2), fetchedAt: days(2), url: "https://github.com", isNew: false,
    triggerId: "trig-launch-rh", triggerName: "Lançamentos & Features",
    tags: ["Docebo", "GitHub", "DevRel"], mentions: 5, trend: 32,
    sources: [{ name: "GitHub Release", url: "github.com/docebo/docebo-sync/releases/v2.0" }],
    summary: "Docebo atacando o ICP de DevRel/eng managers. Para o B2B de tech companies, é diferencial real. Refatorando pode oferecer integração similar via API existente em ~2 semanas."
  },
  {
    id: 304, workspaceId: "ws-rh",
    title: "Cornerstone Learn baixa 30% no plano Mid-Market — promo agressiva",
    description: "Reposicionamento de pricing para mid-market: de US$ 8/usuário/mês para US$ 5.50, com lock-in de 12 meses.",
    source: "LinkedIn", sourceColor: "#0A66C2",
    category: "launches", competitor: "Cornerstone", product: "Cornerstone Learn",
    version: "Mid-Market Plan", featureAreas: ["pricing"],
    launchedAt: days(3),
    relevance: 87, impact: "high",
    publishedAt: days(3), fetchedAt: days(3), url: "https://linkedin.com", isNew: false,
    triggerId: "trig-launch-rh", triggerName: "Lançamentos & Features",
    tags: ["Cornerstone", "Pricing", "Mid-market"], mentions: 17, trend: 88,
    sources: [{ name: "LinkedIn", url: "linkedin.com/posts/cornerstone-pricing" }],
    summary: "Pressão de preço importante. Cornerstone com -30% mira diretamente nossa faixa principal. Análise: avaliar match condicional ou diferenciação por inclusão de mentor humano sem cobrança extra."
  },

  // ─── Fintech ───
  {
    id: 401, workspaceId: "ws-fintech",
    title: "Stark Bank lança API v4 com webhooks de boleto em <300ms",
    description: "Nova versão da API reduz latência e adiciona retry policy configurável. Migração compatível, deprecação da v3 em 6 meses.",
    source: "GitHub", sourceColor: "#181717",
    category: "launches", competitor: "Stark Bank", product: "Stark Bank",
    version: "API v4.0.0", featureAreas: ["api", "performance"],
    launchedAt: hours(5),
    relevance: 88, impact: "high",
    publishedAt: hours(5), fetchedAt: hours(5), url: "https://github.com", isNew: true,
    triggerId: "trig-launch-fin", triggerName: "Releases de PSPs",
    tags: ["Stark Bank", "API", "Webhooks"], mentions: 6, trend: 42,
    sources: [{ name: "GitHub Releases", url: "github.com/starkbank/sdk-python/releases/v4.0.0" }],
    summary: "Latência <300ms é referência. Stark mira clientes high-volume. Stark Pagamentos (mesmo nome do workspace) deve auditar tempo de resposta atual e priorizar otimização do pipeline de webhooks."
  },
  {
    id: 402, workspaceId: "ws-fintech",
    title: "Asaas integra split nativo com Pix Cobrança em 1-click",
    description: "Nova feature reduz fricção do split em marketplaces e SaaS B2B. Disponível em GA para todos os clientes.",
    source: "Product Hunt", sourceColor: "#DA552F",
    category: "launches", competitor: "Asaas", product: "Asaas",
    version: "Pix Split 1.0", featureAreas: ["api", "ux"],
    launchedAt: days(1),
    relevance: 82, impact: "high",
    publishedAt: days(1), fetchedAt: days(1), url: "https://producthunt.com", isNew: true,
    triggerId: "trig-launch-fin", triggerName: "Releases de PSPs",
    tags: ["Asaas", "PIX", "Split"], mentions: 9, trend: 64,
    sources: [{ name: "Product Hunt", url: "producthunt.com/asaas-pix-split" }],
    summary: "Asaas elimina fricção de implementação de split. Para marketplaces, isso reduz time-to-live de ~4 semanas para 1. Resposta competitiva imediata: priorizar PIX Split 1-click no roadmap."
  },
  {
    id: 403, workspaceId: "ws-fintech",
    title: "Iugu lança 'Iugu Intelligence' — análise antifraude com IA generativa",
    description: "Modelo proprietário identifica padrões de fraude em tempo real. Pricing baseado em volume; alpha com 8 clientes enterprise.",
    source: "Crunchbase", sourceColor: "#146AFF",
    category: "launches", competitor: "Iugu", product: "Iugu",
    version: "Intelligence Alpha", featureAreas: ["ai", "security"],
    launchedAt: days(2),
    relevance: 79, impact: "med",
    publishedAt: days(2), fetchedAt: days(2), url: "https://crunchbase.com", isNew: false,
    triggerId: "trig-launch-fin", triggerName: "Releases de PSPs",
    tags: ["Iugu", "Antifraude", "GenAI"], mentions: 5, trend: 38,
    sources: [{ name: "Crunchbase", url: "crunchbase.com/iugu-intelligence" }],
    summary: "Iugu monetizando IA como produto separado. Estratégia razoável — antifraude tem ROI claro. Stark Pagamentos pode considerar partnership com vendor especializado em vez de build-from-scratch."
  },

  // ─── Saúde ───
  {
    id: 501, workspaceId: "ws-saude",
    title: "Conexa Saúde lança triagem por voz com IA em app mobile",
    description: "Paciente fala sintomas, IA pré-classifica especialidade e prioriza encaminhamento. Anamnese estruturada anexada ao médico.",
    source: "Product Hunt", sourceColor: "#DA552F",
    category: "launches", competitor: "Conexa Saúde", product: "Conexa Saúde",
    version: "Voice Triage 1.0", featureAreas: ["ai", "mobile", "ux"],
    launchedAt: hours(6),
    relevance: 91, impact: "high",
    publishedAt: hours(6), fetchedAt: hours(6), url: "https://producthunt.com", isNew: true,
    triggerId: "trig-launch-sau", triggerName: "Releases de Healthtechs",
    tags: ["Conexa", "Voice", "Triagem", "IA"], mentions: 12, trend: 95,
    sources: [{ name: "Product Hunt", url: "producthunt.com/conexa-voice-triage" }],
    summary: "Salto de UX significativo. Voice triage corta 60% do tempo de pré-consulta. Vita deve avaliar parity em 30 dias — ou pelo menos prototyping para roadmap próximo trimestre."
  },
  {
    id: 502, workspaceId: "ws-saude",
    title: "Hapvida B2B introduz dashboard de utilização para People Managers",
    description: "Dashboards com taxa de uso, especialidades mais procuradas, satisfação e ROI estimado por benefício.",
    source: "LinkedIn", sourceColor: "#0A66C2",
    category: "launches", competitor: "Hapvida NotreDame", product: "Hapvida B2B",
    version: "Manager Dashboard 1.0", featureAreas: ["analytics", "ux"],
    launchedAt: days(1),
    relevance: 80, impact: "med",
    publishedAt: days(1), fetchedAt: days(1), url: "https://linkedin.com", isNew: true,
    triggerId: "trig-launch-sau", triggerName: "Releases de Healthtechs",
    tags: ["Hapvida", "Dashboard", "B2B"], mentions: 6, trend: 41,
    sources: [{ name: "LinkedIn", url: "linkedin.com/posts/hapvida-dashboard" }],
    summary: "RH passa a ter dado quantitativo do programa de saúde. Vita precisa expor analytics similares no painel admin — diferencial mínimo para fechar deals corporativos."
  }
];

ALL_INSIGHTS.push(...LAUNCH_INSIGHTS);
ALL_TRIGGERS.push(LAUNCH_TRIGGER_RH, LAUNCH_TRIGGER_FIN, LAUNCH_TRIGGER_SAU);

/* ─── Workspace-scoped helpers ─────────────────────────────────────────────── */
function insightsForWorkspace(allInsights, wsId) {
  return allInsights.filter(i => i.workspaceId === wsId);
}
function triggersForWorkspace(allTriggers, wsId) {
  return allTriggers.filter(t => t.workspaceId === wsId);
}
function workspaceById(id) { return WORKSPACES.find(w => w.id === id); }
function catMetaForWorkspace(ws) {
  if (!ws?.categoryOverrides) return CAT_META;
  const merged = { ...CAT_META };
  Object.entries(ws.categoryOverrides).forEach(([k, v]) => { merged[k] = { ...merged[k], ...v }; });
  return merged;
}

Object.assign(window, {
  MOCK_INSIGHTS: ALL_INSIGHTS, MOCK_TRIGGERS: ALL_TRIGGERS,
  CAT_META, SOURCE_CATALOG, WORKSPACES, FEATURE_AREAS,
  relDate, relScore, sourceById, FREQ_LABEL, GEO_LABEL, AI_DEPTH_LABEL,
  insightsForWorkspace, triggersForWorkspace, workspaceById, catMetaForWorkspace
});
