// ============================================================
// Gaussia Chatbot — Widget IA multi-provider
// ============================================================
//
// CONFIGURATION — Modifier le bloc ci-dessous pour switcher de provider
//
// ▸ provider: "claude" | "openai" | "custom"
//   → "claude"  : utilise l'API Anthropic (clé sk-ant-...)
//   → "openai"  : utilise l'API OpenAI (clé sk-...)
//   → "custom"  : tout endpoint compatible OpenAI (Mistral, Groq, local…)
//
// ▸ apiKey: à remplacer par votre vraie clé, ou injecter via env
//   ⚠️  NE JAMAIS committer une clé en clair dans un repo public.
//       En production, passez par un proxy backend (ex: /api/chat).
//
const CHATBOT_CONFIG = {
  provider: "claude",  // ← changer ici pour switcher

  models: {
    // — ANTHROPIC (Claude) —
    // Créez une clé sur https://console.anthropic.com
    // Modèles dispo : claude-haiku-4-5-20251001 (rapide/pas cher)
    //                  claude-sonnet-4-20250514 (plus puissant)
    claude: {
      apiUrl: "https://api.anthropic.com/v1/messages",
      model: "claude-haiku-4-5-20251001",
      max_tokens: 500,
    },
    // — OPENAI —
    // Créez une clé sur https://platform.openai.com/api-keys
    // Modèles dispo : gpt-4o-mini (rapide/pas cher), gpt-4o (puissant)
    openai: {
      apiUrl: "https://api.openai.com/v1/chat/completions",
      model: "gpt-4o-mini",
      max_tokens: 500,
    },
    // — CUSTOM (endpoint compatible OpenAI) —
    // Fonctionne avec Mistral, Groq, Together, LM Studio, Ollama, etc.
    // Adaptez apiUrl et model selon votre provider.
    custom: {
      apiUrl: "https://ton-endpoint.com/v1/chat/completions",
      model: "ton-modele",
      max_tokens: 500,
    },
  },

  // Clé API — à remplacer ou injecter via variable d'environnement
  // En production, utilisez un proxy backend pour ne pas exposer la clé côté client.
  apiKey: "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",
};

// ============================================================
// SYSTEM PROMPT — Personnalisez ce texte avec vos offres
// ============================================================
const SYSTEM_PROMPT = `Tu es l'assistant virtuel de Gaussia, une agence française spécialisée en IA et automation pour PME, ETI et startups. Tu t'appelles Gauss.

PERSONNALITÉ :
- Chaleureux, professionnel, direct — jamais corporate ni robotique
- Tu tutoies si le visiteur tutoie, sinon tu vouvoies
- Réponses courtes (2-4 phrases max), claires, en français
- Tu utilises des emojis avec parcimonie (1 max par message)

OFFRES GAUSSIA (à orienter naturellement selon le contexte) :
1. **Audit** (4 900 € fixe) — Cartographie des processus, calcul ROI, 3 chantiers prioritaires, roadmap actionnable, restitution + ateliers (2 jours). Idéal pour valider un cap avant d'investir.
2. **Build** (sur devis, forfait) — Conception et déploiement complet : agents IA + automatisations, intégrations SI, mise en prod + monitoring, formation équipes. Inclut tout l'Audit.
3. **Partner** (à partir de 3 500 €/mois) — Accompagnement continu : roadmap trimestrielle, support prioritaire SLA 4h, nouveaux agents & automations, veille IA, canal Slack dédié.

SERVICES :
- Agents IA sur-mesure (Claude, LLM, RAG)
- Automatisations workflow (n8n, Make, Zapier)
- Intégrations & connecteurs (API, webhooks, sync CRM/ERP)
- Formation des équipes (workshops, docs, coaching)

MÉTHODE (4 étapes) :
1. Cartographie (1 sem.) → 2. Pilote (2-3 sem.) → 3. Déploiement (3-6 sem.) → 4. Transmission (continu)

RÉSULTATS TYPIQUES :
- +40h récupérées par semaine
- -68% d'erreurs manuelles
- Déploiement en 3-6 semaines
- Agents opérationnels 24/7

RÈGLES :
- Si la question porte sur les tarifs/prix → présente l'offre la plus adaptée avec le prix, suggère de réserver un audit
- Si la question porte sur les délais → explique la méthode en 4 étapes
- Si la question porte sur la sécurité des données → rassure : hébergement européen, pas d'entraînement sur les données client, contrats DPA
- Si la question porte sur la tech → rassure : pas besoin d'être tech, Gaussia forme les équipes
- Si tu ne sais pas répondre → propose de contacter l'équipe : contact@gaussia.fr ou réserver un créneau sur https://cal.eu/gaussia
- Ne propose JAMAIS une offre de manière forcée — oriente naturellement selon le besoin exprimé
- Pour toute prise de RDV, dirige vers : https://cal.eu/gaussia`;

// ============================================================
// callAI — Fonction universelle multi-provider
// ============================================================
async function callAI(messages) {
  const { provider, models, apiKey } = CHATBOT_CONFIG;
  const cfg = models[provider];
  if (!cfg) throw new Error(`Provider "${provider}" inconnu. Utilisez "claude", "openai" ou "custom".`);

  // — CLAUDE (Anthropic) —
  // Format spécifique : system séparé, messages sans rôle "system"
  if (provider === "claude") {
    const systemMsg = messages.find(m => m.role === "system");
    const userMsgs = messages.filter(m => m.role !== "system");

    const res = await fetch(cfg.apiUrl, {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        "x-api-key": apiKey,
        "anthropic-version": "2023-06-01",
        "anthropic-dangerous-direct-browser-access": "true",
      },
      body: JSON.stringify({
        model: cfg.model,
        max_tokens: cfg.max_tokens,
        system: systemMsg?.content || "",
        messages: userMsgs,
      }),
    });

    if (!res.ok) {
      const err = await res.text();
      throw new Error(`Claude API error ${res.status}: ${err}`);
    }
    const data = await res.json();
    return data.content?.[0]?.text || "Désolé, je n'ai pas pu générer de réponse.";
  }

  // — OPENAI & CUSTOM (format OpenAI-compatible) —
  // Fonctionne avec OpenAI, Mistral, Groq, Together, Ollama, etc.
  const headers = {
    "Content-Type": "application/json",
    "Authorization": `Bearer ${apiKey}`,
  };

  const res = await fetch(cfg.apiUrl, {
    method: "POST",
    headers,
    body: JSON.stringify({
      model: cfg.model,
      max_tokens: cfg.max_tokens,
      messages,
    }),
  });

  if (!res.ok) {
    const err = await res.text();
    throw new Error(`${provider} API error ${res.status}: ${err}`);
  }
  const data = await res.json();
  return data.choices?.[0]?.message?.content || "Désolé, je n'ai pas pu générer de réponse.";
}

// ============================================================
// Composant React — ChatBot Widget
// ============================================================
function ChatBot() {
  const [open, setOpen] = useState(false);
  const [messages, setMessages] = useState([]);
  const [input, setInput] = useState('');
  const [loading, setLoading] = useState(false);
  const [hasGreeted, setHasGreeted] = useState(false);
  const scrollRef = useRef(null);
  const inputRef = useRef(null);
  const { isMobile } = useResponsive();

  // Greeting on first open
  useEffect(() => {
    if (open && !hasGreeted) {
      setMessages([{
        role: 'assistant',
        content: "Bonjour ! 👋 Je suis Gauss, l'assistant Gaussia. Posez-moi vos questions sur nos services, tarifs ou méthode — je suis là pour vous aiguiller.",
      }]);
      setHasGreeted(true);
    }
  }, [open, hasGreeted]);

  // Auto-scroll
  useEffect(() => {
    if (scrollRef.current) {
      scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
    }
  }, [messages, loading]);

  // Focus input on open
  useEffect(() => {
    if (open && inputRef.current) {
      setTimeout(() => inputRef.current.focus(), 300);
    }
  }, [open]);

  const sendMessage = async () => {
    const text = input.trim();
    if (!text || loading) return;

    const userMsg = { role: 'user', content: text };
    const updated = [...messages, userMsg];
    setMessages(updated);
    setInput('');
    setLoading(true);

    try {
      const apiMessages = [
        { role: 'system', content: SYSTEM_PROMPT },
        ...updated,
      ];
      const reply = await callAI(apiMessages);
      setMessages(prev => [...prev, { role: 'assistant', content: reply }]);
    } catch (err) {
      console.error('Chatbot error:', err);
      setMessages(prev => [...prev, {
        role: 'assistant',
        content: "Oups, je rencontre un souci technique. Vous pouvez nous écrire directement à [contact@gaussia.fr](mailto:contact@gaussia.fr) ou [réserver un créneau](https://cal.eu/gaussia).",
      }]);
    } finally {
      setLoading(false);
    }
  };

  const handleKeyDown = (e) => {
    if (e.key === 'Enter' && !e.shiftKey) {
      e.preventDefault();
      sendMessage();
    }
  };

  // Quick suggestions shown after greeting
  const suggestions = [
    "Quels sont vos tarifs ?",
    "Comment ça marche ?",
    "C'est quoi un agent IA ?",
  ];

  const handleSuggestion = (text) => {
    setInput(text);
    setTimeout(() => {
      const userMsg = { role: 'user', content: text };
      const updated = [...messages, userMsg];
      setMessages(updated);
      setInput('');
      setLoading(true);
      callAI([{ role: 'system', content: SYSTEM_PROMPT }, ...updated])
        .then(reply => setMessages(prev => [...prev, { role: 'assistant', content: reply }]))
        .catch(() => setMessages(prev => [...prev, { role: 'assistant', content: "Oups, un souci technique. Écrivez-nous à contact@gaussia.fr." }]))
        .finally(() => setLoading(false));
    }, 50);
  };

  // Simple markdown-lite renderer (bold, links)
  const renderContent = (text) => {
    const parts = text.split(/(\*\*[^*]+\*\*|\[[^\]]+\]\([^)]+\))/g);
    return parts.map((part, i) => {
      const boldMatch = part.match(/^\*\*(.+)\*\*$/);
      if (boldMatch) return <strong key={i}>{boldMatch[1]}</strong>;
      const linkMatch = part.match(/^\[([^\]]+)\]\(([^)]+)\)$/);
      if (linkMatch) return <a key={i} href={linkMatch[2]} target="_blank" rel="noopener noreferrer" style={{ color: 'var(--accent)', textDecoration: 'underline', textUnderlineOffset: 2 }}>{linkMatch[1]}</a>;
      return <span key={i}>{part}</span>;
    });
  };

  const showSuggestions = messages.length === 1 && messages[0].role === 'assistant';

  return (
    <>
      {/* Floating bubble */}
      <button
        id="gaussia-chatbot-toggle"
        className="chatbot-fab"
        onClick={() => setOpen(o => !o)}
        aria-label={open ? "Fermer le chat" : "Ouvrir le chat"}
        style={{
          position: 'fixed',
          bottom: 24,
          right: 24,
          zIndex: 9999,
          width: 56, height: 56,
          borderRadius: '50%',
          background: 'var(--accent)',
          color: 'var(--on-accent)',
          display: 'flex', alignItems: 'center', justifyContent: 'center',
          boxShadow: '0 6px 28px var(--accent-glow), 0 2px 8px rgba(0,0,0,0.12)',
          border: 'none', cursor: 'pointer',
          transition: 'transform 0.3s cubic-bezier(0.2,0.8,0.2,1), box-shadow 0.3s',
          transform: open ? 'scale(0.9)' : 'scale(1)',
        }}
        onMouseEnter={e => { if(!open) e.currentTarget.style.transform = 'scale(1.08)'; }}
        onMouseLeave={e => { e.currentTarget.style.transform = open ? 'scale(0.9)' : 'scale(1)'; }}
      >
        {open ? (
          <svg width="22" height="22" viewBox="0 0 22 22" fill="none"><path d="M6 6L16 16M16 6L6 16" stroke="currentColor" strokeWidth="2" strokeLinecap="round"/></svg>
        ) : (
          <svg width="24" height="24" viewBox="0 0 24 24" fill="none"><path d="M21 12C21 16.418 16.97 20 12 20C10.56 20 9.19 19.71 7.96 19.18L3 20L4.3 16.54C3.48 15.2 3 13.66 3 12C3 7.582 7.03 4 12 4C16.97 4 21 7.582 21 12Z" stroke="currentColor" strokeWidth="1.8" strokeLinejoin="round"/><circle cx="8.5" cy="12" r="1" fill="currentColor"/><circle cx="12" cy="12" r="1" fill="currentColor"/><circle cx="15.5" cy="12" r="1" fill="currentColor"/></svg>
        )}
      </button>

      {/* Chat window */}
      {open && (
        <div className="chatbot-window" style={{
          position: 'fixed',
          bottom: isMobile ? 0 : 92,
          right: isMobile ? 0 : 24,
          width: isMobile ? '100vw' : 380,
          height: isMobile ? '100dvh' : 540,
          maxHeight: isMobile ? '100dvh' : 'calc(100vh - 120px)',
          zIndex: 9998,
          borderRadius: isMobile ? 0 : 20,
          overflow: 'hidden',
          display: 'flex', flexDirection: 'column',
          background: 'var(--bg-elev)',
          border: isMobile ? 'none' : '1px solid var(--line-strong)',
          boxShadow: isMobile ? 'none' : '0 24px 80px rgba(0,0,0,0.18), 0 8px 24px rgba(0,0,0,0.08)',
          animation: 'chatbot-slide-in 0.35s cubic-bezier(0.2,0.8,0.2,1)',
        }}>
          {/* Header */}
          <div style={{
            padding: '16px 20px',
            borderBottom: '1px solid var(--line)',
            display: 'flex', alignItems: 'center', gap: 12,
            background: 'var(--bg-elev)',
            flexShrink: 0,
          }}>
            <div style={{
              width: 36, height: 36, borderRadius: '50%',
              background: 'var(--accent)', color: 'var(--on-accent)',
              display: 'flex', alignItems: 'center', justifyContent: 'center',
              flexShrink: 0,
            }}>
              <GaussiaMark size={16} color="var(--on-accent)" />
            </div>
            <div style={{ flex: 1 }}>
              <div style={{ fontSize: 14, fontWeight: 600, letterSpacing: '-0.01em' }}>Gauss</div>
              <div style={{ fontSize: 11, color: 'var(--text-faint)', fontFamily: 'var(--mono)', letterSpacing: '0.05em' }}>
                Assistant Gaussia · en ligne
              </div>
            </div>
            <button onClick={() => setOpen(false)} aria-label="Fermer" style={{
              width: 32, height: 32, borderRadius: '50%',
              border: '1px solid var(--line)',
              display: 'flex', alignItems: 'center', justifyContent: 'center',
              color: 'var(--text-dim)', cursor: 'pointer', background: 'none',
              transition: 'all 0.2s',
            }}
            onMouseEnter={e => { e.currentTarget.style.borderColor = 'var(--accent)'; e.currentTarget.style.color = 'var(--accent)'; }}
            onMouseLeave={e => { e.currentTarget.style.borderColor = 'var(--line)'; e.currentTarget.style.color = 'var(--text-dim)'; }}
            >
              <svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M3 3L11 11M11 3L3 11" stroke="currentColor" strokeWidth="1.4" strokeLinecap="round"/></svg>
            </button>
          </div>

          {/* Messages area */}
          <div ref={scrollRef} style={{
            flex: 1, overflowY: 'auto', padding: '16px 16px 8px',
            display: 'flex', flexDirection: 'column', gap: 10,
          }}>
            {messages.map((msg, i) => (
              <div key={i} style={{
                display: 'flex',
                justifyContent: msg.role === 'user' ? 'flex-end' : 'flex-start',
              }}>
                <div style={{
                  maxWidth: '82%',
                  padding: '10px 14px',
                  borderRadius: msg.role === 'user' ? '16px 16px 4px 16px' : '16px 16px 16px 4px',
                  background: msg.role === 'user' ? 'var(--accent)' : 'var(--bg-card)',
                  color: msg.role === 'user' ? 'var(--on-accent)' : 'var(--text)',
                  border: msg.role === 'user' ? 'none' : '1px solid var(--line)',
                  fontSize: 14, lineHeight: 1.55,
                  letterSpacing: '-0.005em',
                  wordBreak: 'break-word',
                }}>
                  {renderContent(msg.content)}
                </div>
              </div>
            ))}

            {/* Quick suggestions */}
            {showSuggestions && (
              <div style={{ display: 'flex', gap: 6, flexWrap: 'wrap', marginTop: 4 }}>
                {suggestions.map(s => (
                  <button key={s} onClick={() => handleSuggestion(s)} style={{
                    fontSize: 12, padding: '7px 12px',
                    borderRadius: 999, cursor: 'pointer',
                    background: 'var(--accent-soft)',
                    border: '1px solid var(--accent-glow)',
                    color: 'var(--accent)',
                    fontFamily: 'var(--sans)',
                    fontWeight: 500,
                    transition: 'all 0.2s',
                    letterSpacing: '-0.01em',
                  }}
                  onMouseEnter={e => { e.currentTarget.style.background = 'var(--accent)'; e.currentTarget.style.color = 'var(--on-accent)'; }}
                  onMouseLeave={e => { e.currentTarget.style.background = 'var(--accent-soft)'; e.currentTarget.style.color = 'var(--accent)'; }}
                  >{s}</button>
                ))}
              </div>
            )}

            {/* Typing indicator */}
            {loading && (
              <div style={{ display: 'flex', justifyContent: 'flex-start' }}>
                <div className="chatbot-typing" style={{
                  padding: '12px 18px', borderRadius: '16px 16px 16px 4px',
                  background: 'var(--bg-card)', border: '1px solid var(--line)',
                  display: 'flex', gap: 5, alignItems: 'center',
                }}>
                  <span className="chatbot-dot" style={{ animationDelay: '0s' }} />
                  <span className="chatbot-dot" style={{ animationDelay: '0.15s' }} />
                  <span className="chatbot-dot" style={{ animationDelay: '0.3s' }} />
                </div>
              </div>
            )}
          </div>

          {/* Input bar */}
          <div style={{
            padding: '12px 16px', borderTop: '1px solid var(--line)',
            display: 'flex', gap: 8, alignItems: 'flex-end',
            background: 'var(--bg-elev)', flexShrink: 0,
          }}>
            <input
              ref={inputRef}
              type="text"
              value={input}
              onChange={e => setInput(e.target.value)}
              onKeyDown={handleKeyDown}
              placeholder="Posez votre question…"
              disabled={loading}
              style={{
                flex: 1, padding: '10px 14px',
                borderRadius: 12,
                border: '1px solid var(--line-strong)',
                background: 'var(--bg)',
                color: 'var(--text)',
                fontSize: 14,
                fontFamily: 'var(--sans)',
                outline: 'none',
                transition: 'border-color 0.2s',
                letterSpacing: '-0.005em',
              }}
              onFocus={e => e.target.style.borderColor = 'var(--accent)'}
              onBlur={e => e.target.style.borderColor = 'var(--line-strong)'}
            />
            <button
              onClick={sendMessage}
              disabled={!input.trim() || loading}
              aria-label="Envoyer"
              style={{
                width: 40, height: 40, borderRadius: 12,
                background: input.trim() && !loading ? 'var(--accent)' : 'var(--bg-card)',
                color: input.trim() && !loading ? 'var(--on-accent)' : 'var(--text-faint)',
                border: input.trim() && !loading ? 'none' : '1px solid var(--line)',
                display: 'flex', alignItems: 'center', justifyContent: 'center',
                cursor: input.trim() && !loading ? 'pointer' : 'default',
                transition: 'all 0.2s',
                flexShrink: 0,
              }}
            >
              <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
                <path d="M14 2L7 9M14 2L9.5 14L7 9M14 2L2 6.5L7 9" stroke="currentColor" strokeWidth="1.4" strokeLinecap="round" strokeLinejoin="round"/>
              </svg>
            </button>
          </div>

          {/* Powered by */}
          <div style={{
            textAlign: 'center', padding: '6px 0 10px',
            fontSize: 10, color: 'var(--text-faint)',
            fontFamily: 'var(--mono)', letterSpacing: '0.05em',
            flexShrink: 0,
          }}>
            Propulsé par Gaussia · IA
          </div>
        </div>
      )}
    </>
  );
}

Object.assign(window, { ChatBot });
