import React, { useState, useRef, useEffect } from 'react'; import { MessageSquare, X, Send, Bot, User, Sparkles, MinusCircle } from 'lucide-react'; import { GoogleGenAI } from "@google/genai"; interface AIChatAssistantProps { userName: string; contextData: { revenue: number; expenses: number; profit: number; pendingReceivables: number; } } interface Message { id: string; role: 'user' | 'assistant'; text: string; timestamp: Date; } export const AIChatAssistant: React.FC = ({ userName, contextData }) => { if (!process.env.API_KEY) { return null; } const [isOpen, setIsOpen] = useState(false); const [isTyping, setIsTyping] = useState(false); const [inputValue, setInputValue] = useState(''); const [messages, setMessages] = useState([ { id: 'welcome', role: 'assistant', text: `Olá ${userName}! 🤖\n\nSou seu consultor especialista no ComFi. Acompanho seus números em tempo real e posso ajudar com:\n\n- **Análise Financeira** (Lucro, Caixa, Despesas)\n- **Estratégias de Crescimento** (Marketing, Vendas)\n- **Gestão Operacional**\n\nComo posso ajudar seu negócio hoje?`, timestamp: new Date() } ]); const messagesEndRef = useRef(null); const scrollToBottom = () => { messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }); }; useEffect(() => { scrollToBottom(); }, [messages, isOpen]); // Função para processar formatação de texto (Negrito e Listas) const renderFormattedText = (text: string) => { return text.split('\n').map((line, index) => { // Processar item de lista if (line.trim().startsWith('- ')) { const content = line.trim().substring(2); return (
{parseBold(content)}
); } // Processar linha vazia if (line.trim() === '') { return
; } // Parágrafo normal return

{parseBold(line)}

; }); }; const parseBold = (text: string) => { return text.split(/(\*\*.*?\*\*)/).map((part, i) => { if (part.startsWith('**') && part.endsWith('**')) { return {part.slice(2, -2)}; } return part; }); }; const handleSend = async () => { if (!inputValue.trim()) return; const userMsg: Message = { id: Math.random().toString(), role: 'user', text: inputValue, timestamp: new Date() }; setMessages(prev => [...prev, userMsg]); setInputValue(''); setIsTyping(true); try { // Inicializar Cliente Gemini const ai = new GoogleGenAI({ apiKey: process.env.API_KEY }); // Construir Instrução do Sistema com Contexto Financeiro Atual const systemInstruction = ` Você é o **ComFi Assistant**, um consultor de elite em gestão empresarial e marketing, integrado ao sistema ComFi. **CONTEXTO FINANCEIRO ATUAL DO USUÁRIO:** - Receita: R$ ${contextData.revenue.toLocaleString('pt-BR')} - Despesas: R$ ${contextData.expenses.toLocaleString('pt-BR')} - Lucro Líquido: R$ ${contextData.profit.toLocaleString('pt-BR')} - A Receber (Pendente): R$ ${contextData.pendingReceivables.toLocaleString('pt-BR')} **SUA MISSÃO:** Atuar como um estrategista sênior. Analise os dados e a pergunta do usuário para fornecer conselhos práticos, ideias de marketing criativas e insights financeiros. **DIRETRIZES DE RESPOSTA (RIGOROSO):** 1. **Formatação Limpa:** JAMAIS escreva blocos de texto longos. Use parágrafos curtos. 2. **Uso de Listas:** Sempre que apresentar passos, ideias ou dados, use listas com marcadores (\`- \`). 3. **Destaques:** Use **negrito** para números importantes e termos-chave. 4. **Tom de Voz:** Profissional, especialista, motivador e direto ao ponto. 5. **Foco em Ação:** Dê sugestões que o usuário possa implementar hoje. Exemplo de formato ideal: "Baseado nos seus dados, aqui estão 3 ações: - **Ação 1**: Explicação breve. - **Ação 2**: Explicação breve." `; // Chamada à API const response = await ai.models.generateContent({ model: 'gemini-3-flash-preview', contents: [ { role: 'user', parts: [{ text: inputValue }] } ], config: { systemInstruction: systemInstruction, temperature: 0.7, // Criatividade balanceada para marketing } }); const text = response.text || "Desculpe, não consegui gerar uma resposta no momento."; const botMsg: Message = { id: Math.random().toString(), role: 'assistant', text: text, timestamp: new Date() }; setMessages(prev => [...prev, botMsg]); } catch (error) { console.error("Erro ao chamar Gemini API:", error); const errorMsg: Message = { id: Math.random().toString(), role: 'assistant', text: "Desculpe, estou enfrentando uma instabilidade temporária na minha conexão neural. 🧠\n\nPor favor, tente novamente em alguns instantes.", timestamp: new Date() }; setMessages(prev => [...prev, errorMsg]); } finally { setIsTyping(false); } }; const handleKeyPress = (e: React.KeyboardEvent) => { if (e.key === 'Enter') handleSend(); }; return ( <> {/* Floating Button */} {/* Chat Window */}
{/* Header */}

ComFi Especialista AI

Consultor Online

{/* Messages Area */}
{messages.map((msg) => (
{msg.role === 'user' ? : }
{msg.role === 'assistant' ? (
{renderFormattedText(msg.text)}
) : ( msg.text )}
{msg.timestamp.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'})}
))} {isTyping && (
)}
{/* Input Area */}
setInputValue(e.target.value)} onKeyPress={handleKeyPress} placeholder="Pergunte sobre lucro, ideias de venda..." className="flex-1 bg-slate-50 border border-slate-200 rounded-xl px-4 py-3 text-sm outline-none focus:ring-2 focus:ring-primary-200 text-slate-700 placeholder-slate-400 transition-all" />
); };