import React, { useState, useEffect, useRef } from 'react';
import { Send, Mic, MicOff, Volume2, VolumeX, Minimize2, Maximize2, X, MessageCircle } from 'lucide-react';
import './AIAssistant.css';

interface Message {
    role: 'user' | 'assistant';
    content: string;
    data?: any;
    timestamp: string;
}

interface ConversationMessage {
    role: string;
    content: string;
}

const AIAssistant: React.FC = () => {
    const [isOpen, setIsOpen] = useState(false);
    const [isMinimized, setIsMinimized] = useState(false);
    const [messages, setMessages] = useState<Message[]>([]);
    const [inputMessage, setInputMessage] = useState('');
    const [isLoading, setIsLoading] = useState(false);
    const [isListening, setIsListening] = useState(false);
    const [isSpeaking, setIsSpeaking] = useState(false);
    const [voiceEnabled, setVoiceEnabled] = useState(true);
    const [conversationHistory, setConversationHistory] = useState<ConversationMessage[]>([]);

    const messagesEndRef = useRef<HTMLDivElement>(null);
    const recognitionRef = useRef<any>(null);
    const synthRef = useRef(window.speechSynthesis);

    // Initialize Speech Recognition
    useEffect(() => {
        const SpeechRecognition = (window as any).SpeechRecognition || (window as any).webkitSpeechRecognition;
        
        if (SpeechRecognition) {
            recognitionRef.current = new SpeechRecognition();
            recognitionRef.current.continuous = false;
            recognitionRef.current.interimResults = false;
            recognitionRef.current.lang = 'en-US';

            recognitionRef.current.onresult = (event: any) => {
                const transcript = event.results[0][0].transcript;
                setInputMessage(transcript);
                setIsListening(false);
            };

            recognitionRef.current.onerror = (event: any) => {
                console.error('Speech recognition error:', event.error);
                setIsListening(false);
            };

            recognitionRef.current.onend = () => {
                setIsListening(false);
            };
        }

        // Add welcome message
        setMessages([
            {
                role: 'assistant',
                content: 'Hi! I\'m your AI assistant. I can help you with bookings, customers, revenue, statistics, and more. What would you like to know?',
                timestamp: new Date().toISOString()
            }
        ]);

        return () => {
            if (recognitionRef.current) {
                recognitionRef.current.stop();
            }
            if (synthRef.current) {
                synthRef.current.cancel();
            }
        };
    }, []);

    // Auto-scroll to bottom
    useEffect(() => {
        scrollToBottom();
    }, [messages]);

    const scrollToBottom = () => {
        messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
    };

    const toggleVoiceRecognition = () => {
        if (isListening) {
            recognitionRef.current?.stop();
            setIsListening(false);
        } else {
            try {
                recognitionRef.current?.start();
                setIsListening(true);
            } catch (error) {
                console.error('Error starting recognition:', error);
            }
        }
    };

    const speak = (text: string) => {
        if (!voiceEnabled || !text) return;

        // Cancel any ongoing speech
        synthRef.current.cancel();

        const utterance = new SpeechSynthesisUtterance(text);
        utterance.rate = 1.0;
        utterance.pitch = 1.0;
        utterance.volume = 1.0;
        utterance.lang = 'en-US';

        utterance.onstart = () => setIsSpeaking(true);
        utterance.onend = () => setIsSpeaking(false);
        utterance.onerror = () => setIsSpeaking(false);

        synthRef.current.speak(utterance);
    };

    const stopSpeaking = () => {
        synthRef.current.cancel();
        setIsSpeaking(false);
    };

    const sendMessage = async () => {
        if (!inputMessage.trim() || isLoading) return;

        const userMessage: Message = {
            role: 'user',
            content: inputMessage,
            timestamp: new Date().toISOString()
        };

        setMessages(prev => [...prev, userMessage]);
        setConversationHistory(prev => [...prev, { role: 'user', content: inputMessage }]);
        setInputMessage('');
        setIsLoading(true);

        try {
            const response = await fetch('/api/ai-assistant/query', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                    'Accept': 'application/json',
                },
                body: JSON.stringify({
                    message: inputMessage,
                    conversation_history: conversationHistory
                })
            });

            const data = await response.json();

            if (data.success) {
                const assistantMessage: Message = {
                    role: 'assistant',
                    content: data.response,
                    data: data.data,
                    timestamp: new Date().toISOString()
                };

                setMessages(prev => [...prev, assistantMessage]);
                setConversationHistory(prev => [...prev, { role: 'assistant', content: data.response }]);

                // Speak the response
                speak(data.response);
            } else {
                throw new Error(data.error || 'Failed to get response');
            }
        } catch (error) {
            console.error('Error sending message:', error);
            const errorMessage: Message = {
                role: 'assistant',
                content: 'I apologize, but I encountered an error. Please try again.',
                timestamp: new Date().toISOString()
            };
            setMessages(prev => [...prev, errorMessage]);
        } finally {
            setIsLoading(false);
        }
    };

    const handleKeyPress = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {
        if (e.key === 'Enter' && !e.shiftKey) {
            e.preventDefault();
            sendMessage();
        }
    };

    const formatMessage = (message: string) => {
        // Format message with basic markdown-like styling
        let formatted = message.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>');
        formatted = formatted.replace(/\n/g, '<br/>');
        return formatted;
    };

    const clearConversation = () => {
        setMessages([
            {
                role: 'assistant',
                content: 'Conversation cleared. How can I help you?',
                timestamp: new Date().toISOString()
            }
        ]);
        setConversationHistory([]);
        stopSpeaking();
    };

    if (!isOpen) {
        return (
            <button
                onClick={() => setIsOpen(true)}
                className="ai-assistant-fab"
                title="Open AI Assistant"
            >
                <MessageCircle size={24} />
                <span className="ai-assistant-badge">AI</span>
            </button>
        );
    }

    return (
        <div className={`ai-assistant-container ${isMinimized ? 'minimized' : ''}`}>
            {/* Header */}
            <div className="ai-assistant-header">
                <div className="ai-assistant-header-left">
                    <div className="ai-assistant-avatar">
                        <MessageCircle size={20} />
                    </div>
                    <div className="ai-assistant-title">
                        <h3>AI Assistant</h3>
                        <span className={`ai-assistant-status ${isLoading ? 'typing' : 'online'}`}>
                            {isLoading ? 'Thinking...' : isListening ? 'Listening...' : 'Online'}
                        </span>
                    </div>
                </div>
                <div className="ai-assistant-header-actions">
                    <button
                        onClick={() => setVoiceEnabled(!voiceEnabled)}
                        className="ai-assistant-icon-btn"
                        title={voiceEnabled ? 'Disable Voice' : 'Enable Voice'}
                    >
                        {voiceEnabled ? <Volume2 size={18} /> : <VolumeX size={18} />}
                    </button>
                    <button
                        onClick={() => setIsMinimized(!isMinimized)}
                        className="ai-assistant-icon-btn"
                        title={isMinimized ? 'Maximize' : 'Minimize'}
                    >
                        {isMinimized ? <Maximize2 size={18} /> : <Minimize2 size={18} />}
                    </button>
                    <button
                        onClick={() => setIsOpen(false)}
                        className="ai-assistant-icon-btn"
                        title="Close"
                    >
                        <X size={18} />
                    </button>
                </div>
            </div>

            {/* Messages */}
            {!isMinimized && (
                <>
                    <div className="ai-assistant-messages">
                        {messages.map((message, index) => (
                            <div
                                key={index}
                                className={`ai-assistant-message ${message.role}`}
                            >
                                {message.role === 'assistant' && (
                                    <div className="ai-assistant-message-avatar">
                                        <MessageCircle size={16} />
                                    </div>
                                )}
                                <div className="ai-assistant-message-content">
                                    <div
                                        className="ai-assistant-message-text"
                                        dangerouslySetInnerHTML={{
                                            __html: formatMessage(message.content)
                                        }}
                                    />
                                    <span className="ai-assistant-message-time">
                                        {new Date(message.timestamp).toLocaleTimeString([], {
                                            hour: '2-digit',
                                            minute: '2-digit'
                                        })}
                                    </span>
                                </div>
                            </div>
                        ))}
                        {isLoading && (
                            <div className="ai-assistant-message assistant">
                                <div className="ai-assistant-message-avatar">
                                    <MessageCircle size={16} />
                                </div>
                                <div className="ai-assistant-typing-indicator">
                                    <span></span>
                                    <span></span>
                                    <span></span>
                                </div>
                            </div>
                        )}
                        <div ref={messagesEndRef} />
                    </div>

                    {/* Quick Actions */}
                    <div className="ai-assistant-quick-actions">
                        <button
                            onClick={() => setInputMessage("Show me today's bookings")}
                            className="ai-assistant-quick-btn"
                        >
                            Today's Bookings
                        </button>
                        <button
                            onClick={() => setInputMessage("What's the revenue this month?")}
                            className="ai-assistant-quick-btn"
                        >
                            Monthly Revenue
                        </button>
                        <button
                            onClick={() => setInputMessage("Show me statistics")}
                            className="ai-assistant-quick-btn"
                        >
                            Statistics
                        </button>
                        <button
                            onClick={clearConversation}
                            className="ai-assistant-quick-btn clear"
                        >
                            Clear Chat
                        </button>
                    </div>

                    {/* Input */}
                    <div className="ai-assistant-input-container">
                        <div className="ai-assistant-input-wrapper">
                            <textarea
                                value={inputMessage}
                                onChange={(e) => setInputMessage(e.target.value)}
                                onKeyPress={handleKeyPress}
                                placeholder={isListening ? 'Listening...' : 'Ask me anything...'}
                                className="ai-assistant-input"
                                rows={1}
                                disabled={isLoading}
                            />
                            <div className="ai-assistant-input-actions">
                                {recognitionRef.current && (
                                    <button
                                        onClick={toggleVoiceRecognition}
                                        className={`ai-assistant-voice-btn ${isListening ? 'listening' : ''}`}
                                        title={isListening ? 'Stop listening' : 'Voice input'}
                                        disabled={isLoading}
                                    >
                                        {isListening ? <MicOff size={20} /> : <Mic size={20} />}
                                    </button>
                                )}
                                <button
                                    onClick={sendMessage}
                                    className="ai-assistant-send-btn"
                                    disabled={!inputMessage.trim() || isLoading}
                                    title="Send message"
                                >
                                    <Send size={20} />
                                </button>
                            </div>
                        </div>
                    </div>
                </>
            )}
        </div>
    );
};

export default AIAssistant;
