// AAP — icons, scenarios, helpers
// NOTE QA : Les scénarios simulés (AAP_SCENARIOS) sont conservés pour rétro-compatibilité
// mais ne sont plus utilisés — les vraies réponses viennent de l'AAP via /ask (tracking_server.py)
const Icon = {
  Plus: ({s=14}) => <svg width={s} height={s} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round"><path d="M12 5v14M5 12h14"/></svg>,
  Send: ({s=14}) => <svg width={s} height={s} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M5 12l14-7-7 14-2-5-5-2z"/></svg>,
  Stop: ({s=12}) => <svg width={s} height={s} viewBox="0 0 24 24" fill="currentColor"><rect x="6" y="6" width="12" height="12" rx="1.5"/></svg>,
  Attach: ({s=16}) => <svg width={s} height={s} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round"><path d="M21 11.5l-8.5 8.5a5 5 0 0 1-7-7l9-9a3.5 3.5 0 0 1 5 5l-9 9a2 2 0 0 1-3-3l8-8"/></svg>,
  Mic: ({s=16}) => <svg width={s} height={s} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round"><rect x="9" y="3" width="6" height="12" rx="3"/><path d="M5 11a7 7 0 0 0 14 0M12 18v3"/></svg>,
  Sparkle: ({s=14}) => <svg width={s} height={s} viewBox="0 0 24 24" fill="currentColor"><path d="M12 2l1.6 5.4L19 9l-5.4 1.6L12 16l-1.6-5.4L5 9l5.4-1.6L12 2z"/></svg>,
  Settings: ({s=16}) => <svg width={s} height={s} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1.1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1.1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3H9a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8V9a1.7 1.7 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1z"/></svg>,
  Share: ({s=16}) => <svg width={s} height={s} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"><path d="M4 12v7a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-7M16 6l-4-4-4 4M12 2v13"/></svg>,
  Search: ({s=14}) => <svg width={s} height={s} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round"><circle cx="11" cy="11" r="7"/><path d="M21 21l-4.3-4.3"/></svg>,
  CRM: ({s=14}) => <svg width={s} height={s} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round"><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M22 21v-2a4 4 0 0 0-3-3.9M16 3.1a4 4 0 0 1 0 7.8"/></svg>,
  Calc: ({s=14}) => <svg width={s} height={s} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round"><rect x="4" y="2" width="16" height="20" rx="2"/><path d="M8 6h8M8 12h2M14 12h2M8 16h2M14 16h2"/></svg>,
  ChevronRight: ({s=14}) => <svg width={s} height={s} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round"><path d="M9 6l6 6-6 6"/></svg>,
  Bolt: ({s=14}) => <svg width={s} height={s} viewBox="0 0 24 24" fill="currentColor"><path d="M13 2L3 14h7l-1 8 10-12h-7l1-8z"/></svg>,
  File: ({s=14}) => <svg width={s} height={s} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><path d="M14 2v6h6M16 13H8M16 17H8M10 9H8"/></svg>,
  Pin: ({s=14}) => <svg width={s} height={s} viewBox="0 0 24 24" fill="currentColor"><path d="M12 2l2 6h6l-5 4 2 7-7-5-7 5 2-7-5-4h6z"/></svg>,
  Check: ({s=12}) => <svg width={s} height={s} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="3" strokeLinecap="round" strokeLinejoin="round"><path d="M5 12l5 5L20 7"/></svg>,
};

window.AAP_Icon = Icon;

// Pre-written conversation history for sidebar
window.AAP_HISTORY = [
  { id: 'today-1', title: 'Devis flotte 50 véhicules — Logitex', group: "Aujourd'hui", active: true },
  { id: 'today-2', title: 'Relance prospect Bouygues Construction', group: "Aujourd'hui" },
  { id: 'today-3', title: 'Analyse concurrentielle AXA Pro', group: "Aujourd'hui" },
  { id: 'y-1', title: 'Multirisque commerce — boulangerie Levain', group: 'Hier' },
  { id: 'y-2', title: 'RC Pro freelances tech — comparatif', group: 'Hier' },
  { id: 'y-3', title: 'Suivi sinistre dossier #2847', group: 'Hier' },
  { id: 'w-1', title: 'Onboarding nouveau lead — Mistral SA', group: '7 derniers jours' },
  { id: 'w-2', title: 'Email de relance Q2 — 12 prospects', group: '7 derniers jours' },
  { id: 'w-3', title: 'Pricing flotte transport routier', group: '7 derniers jours' },
  { id: 'w-4', title: 'Prévention cyber — PME industrie', group: '7 derniers jours' },
  { id: 'old-1', title: 'Renouvellement contrat Capgemini Sud', group: 'Avril' },
  { id: 'old-2', title: 'Étude marché santé entreprise', group: 'Avril' },
];

// Suggestions on welcome screen
window.AAP_SUGGESTIONS = [
  { label: 'Devis', text: "Génère un devis multirisque pour une PME de 80 salariés dans la tech" },
  { label: 'CRM', text: "Quels sont mes 5 leads les plus chauds cette semaine ?" },
  { label: 'Analyse', text: "Compare nos garanties RC Pro avec celles d'AXA et Generali" },
  { label: 'Email', text: "Rédige une relance pour un prospect qui n'a pas répondu depuis 10 jours" },
];

// The streaming response simulator
// Each scenario = ordered list of "events":
//   {type:'thinking', text, ms}
//   {type:'tool', name, icon, sub, params, result, durationMs}
//   {type:'text', content}  -- markdown-ish
//   {type:'card', kind, data}
//   {type:'sources', list}
window.AAP_SCENARIOS = {
  'devis': {
    match: /devis|multirisque|prime|cotisation|tarif/i,
    events: [
      { type: 'thinking', text: 'Analyse de la demande et du profil entreprise…', ms: 900 },
      { type: 'tool', name: 'CRM · Calipso', icon: 'crm', sub: 'Recherche profil entreprise', params: [
          { k: 'secteur', v: 'tech / SaaS' },
          { k: 'effectif', v: '80 salariés' },
          { k: 'CA estimé', v: '8-12 M€' },
        ], result: '3 entreprises similaires trouvées · base actuarielle activée', durationMs: 1400 },
      { type: 'tool', name: 'Tarificateur Multirisque Pro v4.2', icon: 'calc', sub: 'Calcul de la prime', params: [
          { k: 'RC exploitation', v: '8 M€ — 1 240 €/an' },
          { k: 'Multirisque biens', v: '1.2 M€ — 2 180 €/an' },
          { k: 'Cyber risques', v: '500 K€ — 1 850 €/an' },
          { k: 'Pertes exploitation', v: '12 mois — 1 420 €/an' },
        ], result: 'Prime annuelle : 6 690 € HT', durationMs: 1800 },
      { type: 'text', content: "Voici la **proposition Calipso Multirisque Pro** que j'ai construite pour ce profil — équilibre entre couverture étendue et tarif compétitif sur le segment tech." },
      { type: 'card', kind: 'quote', data: {
          title: 'Multirisque Pro · Tech 80 salariés',
          rows: [
            { label: 'RC Exploitation 8 M€', value: '1 240 €' },
            { label: 'Multirisque biens 1,2 M€', value: '2 180 €' },
            { label: 'Cyber 500 K€ + assistance', value: '1 850 €' },
            { label: 'Pertes exploitation 12 mois', value: '1 420 €' },
          ],
          total: '6 690 €',
          totalLabel: 'Prime HT / an',
        }
      },
      { type: 'text', content: "Trois leviers d'optimisation possibles : franchise relevée à 2 500 € (-8%), exclusion data-center hors UE (-4%), ou pack 3 ans avec engagement (-12%). Veux-tu que je génère le PDF officiel et que je l'envoie au commercial ?" },
    ],
  },
  'leads': {
    match: /lead|prospect|chaud|pipeline|opportunit/i,
    events: [
      { type: 'thinking', text: 'Connexion au CRM et scoring des opportunités…', ms: 800 },
      { type: 'tool', name: 'CRM · Calipso', icon: 'crm', sub: 'Pipeline commercial · 7 jours', params: [
          { k: 'filtres', v: 'score > 70, stade ≥ qualification' },
          { k: 'commerciaux', v: 'tous · Île-de-France' },
        ], result: '47 opportunités scannées · 5 leads chauds identifiés', durationMs: 1300 },
      { type: 'tool', name: 'Recherche actualité', icon: 'search', sub: 'Signaux faibles & événements', params: [
          { k: 'sources', v: 'LinkedIn, BODACC, presse pro' },
        ], result: '12 signaux récents · 3 levées de fonds détectées', durationMs: 1100 },
      { type: 'text', content: "**5 leads chauds cette semaine** — classés par probabilité de signature × valeur annuelle estimée :" },
      { type: 'card', kind: 'leads', data: [
          { name: 'Margaux Lefèvre', co: 'Mistral Industries · 240 sal.', score: '94', tier: 'hot', signal: 'Levée 18M€' },
          { name: 'Karim Benali', co: 'Logitex Transport · flotte 80', score: '89', tier: 'hot', signal: 'RDV +1' },
          { name: 'Sophie Renaud', co: 'Bouygues Construction Sud', score: '82', tier: 'hot', signal: 'Devis ouvert 4×' },
          { name: 'Thomas Vidal', co: 'Capgemini Sud-Ouest', score: '76', tier: 'warm', signal: 'Renouvel. Q3' },
          { name: 'Léa Marchetti', co: 'Levain Boulangeries (12 pts)', score: '71', tier: 'warm', signal: 'Sinistre voisin' },
        ]
      },
      { type: 'text', content: "Recommandation : appeler **Karim Benali aujourd'hui avant 17h** — il a un RDV concurrent demain et son devis flotte est prêt côté Calipso. Je peux préparer la note d'appel ?" },
    ],
  },
  'compare': {
    match: /compar|axa|generali|allianz|concurr/i,
    events: [
      { type: 'thinking', text: 'Comparaison des garanties sur la base produits…', ms: 900 },
      { type: 'tool', name: 'Base concurrentielle', icon: 'search', sub: 'AXA Pro · Generali Business', params: [
          { k: 'produit', v: 'RC Professionnelle' },
          { k: 'maj base', v: '14 avril 2026' },
        ], result: '23 critères analysés', durationMs: 1500 },
      { type: 'text', content: "**Comparatif RC Pro · Calipso vs AXA vs Generali** — sur le segment tech / conseil :" },
      { type: 'card', kind: 'compare', data: [
          { critere: 'Plafond standard', calipso: '8 M€', axa: '5 M€', gen: '6 M€' },
          { critere: 'Cyber inclus', calipso: '✓ 500K€', axa: '✗ option', gen: '✓ 250K€' },
          { critere: 'Délai indemnisation', calipso: '< 21j', axa: '< 30j', gen: '< 28j' },
          { critere: 'Prime indicative 80 sal.', calipso: '1 240 €', axa: '1 380 €', gen: '1 320 €' },
        ]
      },
      { type: 'text', content: "Notre **avantage clé** : cyber natif et plafond supérieur à prix égal ou inférieur. Faiblesse : pas de RC Mandataire pour fonctions dirigeantes — on peut l'ajouter en option 380€/an. Tu veux le pitch deal-breaker à utiliser en RDV ?" },
    ],
  },
  'email': {
    match: /email|relance|mail|message|courri/i,
    events: [
      { type: 'thinking', text: 'Lecture de l\'historique et tonalité commerciale…', ms: 700 },
      { type: 'tool', name: 'CRM · Calipso', icon: 'crm', sub: 'Contexte du prospect', params: [
          { k: 'dernier contact', v: 'il y a 10 jours' },
          { k: 'stade', v: 'devis envoyé · ouvert 2×' },
          { k: 'persona', v: 'DAF · décision rationnelle' },
        ], result: 'Contexte récupéré', durationMs: 900 },
      { type: 'text', content: "Voici une **relance courte, valeur d'abord, sans pression** — adaptée au profil DAF :" },
      { type: 'card', kind: 'email', data: {
          subject: 'Question rapide sur le devis Calipso',
          body: `Bonjour Madame Renaud,\n\nJe reviens vers vous suite à notre échange du 18 avril sur la couverture multirisque pour vos 4 sites.\n\nDeux choses pourraient vous intéresser depuis :\n  • Notre actuariat a affiné la tarification flotte → -7% sur la cotisation initiale\n  • Un cas client comparable (BTP, 120 sal.) vient de signer — je peux partager la structure du contrat si utile\n\nUne fenêtre de 15 minutes mardi ou jeudi prochain ?\n\nBien cordialement,\nMarc Dupont · Calipso Assurances`
        }
      },
      { type: 'text', content: "Ton calibré pour un DAF : factuel, deux preuves concrètes, CTA simple. Je peux générer 2 variantes (plus directe / plus chaleureuse) ?" },
    ],
  },
  'default': {
    match: /.*/,
    events: [
      { type: 'thinking', text: 'Analyse de la demande…', ms: 800 },
      { type: 'tool', name: 'CRM · Calipso', icon: 'crm', sub: 'Recherche contextuelle', params: [
          { k: 'requête', v: 'analyse libre' },
        ], result: 'Contexte chargé', durationMs: 1200 },
      { type: 'text', content: "Bonne question. Voici comment je l'aborderais en m'appuyant sur les données Calipso :\n\n• **Phase 1 — qualification** : identifier le besoin réel derrière la demande\n• **Phase 2 — proposition** : construire une offre adaptée au risque et au budget\n• **Phase 3 — closing** : adresser les objections par la preuve (cas clients, indicateurs)\n\nVeux-tu que je creuse un de ces angles avec un cas concret ?" },
    ],
  },
};

window.AAP_pickScenario = function(text) {
  const S = window.AAP_SCENARIOS;
  for (const key of Object.keys(S)) {
    if (key === 'default') continue;
    if (S[key].match.test(text)) return S[key];
  }
  return S.default;
};
