import { useMemo, useState } from 'react';
import { useLocation, useNavigate, useParams } from 'react-router-dom';
import { BsArrowLeft, BsStars, BsSend } from 'react-icons/bs';
import { TaleDashbaordMainCard } from '@components/TaleDashbaordMainCard';
import { TaleText } from '@components/TaleText';
import { useTranslation, getFixedT } from '@/hooks/useTranslation';
import { getCoreQuestions, toSurveyQuestion, getProblemById } from './taleScanProblems';

/**
 * Écran de discussion avec l'assistant IA TaleScan — placé entre le choix de
 * langue (popup dans TaleScanDashboard) et la création réelle du survey.
 *
 * La discussion suit TOUJOURS la langue de l'interface (useTranslation()
 * sans argument) — jamais la langue choisie dans le popup TaleScan. Ce choix
 * (`language`, reçu via location.state) n'est utilisé qu'au moment de la
 * génération finale du questionnaire (handleGenerate).
 *
 * INTERACTIF MAIS SANS VRAI AGENT POUR L'INSTANT : taper un message et
 * appuyer sur Envoyer ajoute bien la bulle utilisateur, mais la réponse de
 * l'assistant est une confirmation générique fixe (pas une vraie
 * compréhension du message) — pour ne pas donner l'illusion d'une IA
 * fonctionnelle avant que l'agent réel soit branché. Le bouton "Générer" en
 * bas reprend toujours la génération statique existante (getCoreQuestions),
 * indépendamment de ce qui a été tapé dans le chat.
 * TODO(agent réel) : remplacer handleSend et handleGenerate par de vrais
 * appels à l'agent une fois ses specs connues (endpoint, payload attendu,
 * format de réponse).
 */

const INITIAL_MOCK_MESSAGES = [
    { role: 'assistant', textKey: 'surveyBuilder.taleScan.conversation.mock.greeting' },
];

// Copié de TaleScanDashboard.jsx — à factoriser dans un module partagé
// (ex. taleScanLanguages.js) plutôt que dupliqué, une fois cet écran validé.
const SURVEY_LANG_TO_LOCALE = {
    ENGLISH: 'en',
    FRENCH: 'fr',
    ARABIC: 'ar',
    TUNISIAN_ARABIC: 'tn',
};

function AssistantAvatar() {
    return (
        <div className="shrink-0 w-8 h-8 rounded-full bg-tale-business flex items-center justify-center">
            <BsStars className="text-white text-sm" />
        </div>
    );
}

function ChatBubble({ role, text }) {
    const isAssistant = role === 'assistant';
    return (
        <div className={`flex items-end gap-2 ${isAssistant ? 'justify-start' : 'justify-end'}`}>
            {isAssistant && <AssistantAvatar />}
            <div
                className={`max-w-[75%] rounded-2xl px-4 py-3 text-sm leading-relaxed ${
                    isAssistant
                        ? 'bg-gray-100 text-gray-900 rounded-bl-sm'
                        : 'bg-tale-business text-white rounded-br-sm'
                }`}
            >
                {text}
            </div>
        </div>
    );
}

export default function TaleScanConversation({ basePath = '/scan' }) {
    const navigate = useNavigate();
    const location = useLocation();
    const { domainId, problemId } = useParams();
    const { t } = useTranslation();

    // Reçus depuis TaleScanDashboard via handleLanguageConfirm.
    const { language, category } = location.state ?? {};

    const problem = useMemo(() => getProblemById(problemId), [problemId]);

    // Historique local — messages tapés par l'utilisateur ajoutés ici, en
    // plus du message d'accueil initial. Pas de persistance, pas d'appel API.
    const [extraMessages, setExtraMessages] = useState([]); // { role, text } — texte déjà résolu, pas une clé
    const [draft, setDraft] = useState('');
    const [isGenerating, setIsGenerating] = useState(false);

    const messages = useMemo(() => {
        const initial = INITIAL_MOCK_MESSAGES.map((m) => ({ role: m.role, text: t(m.textKey) }));
        return [...initial, ...extraMessages];
    }, [t, extraMessages]);

    const handleBack = () => {
        navigate(`${basePath}/${domainId}`);
    };

    const handleSend = () => {
        const trimmed = draft.trim();
        if (!trimmed) return;
        setExtraMessages((prev) => [
            ...prev,
            { role: 'user', text: trimmed },
            { role: 'assistant', text: t('surveyBuilder.taleScan.conversation.mock.acknowledgement') },
        ]);
        setDraft('');
    };

    const handleInputKeyDown = (e) => {
        if (e.key === 'Enter') {
            e.preventDefault();
            handleSend();
        }
    };

    // TODO(agent réel) : remplacer ce handler par l'appel à l'agent une fois
    // ses specs connues. Pour l'instant : même génération statique que
    // l'ancien handleLanguageConfirm direct, indépendante du chat.
    const handleGenerate = () => {
        if (!problem || !language) return; // état incomplet — navigation directe interdite
        setIsGenerating(true);
        const fixedT = getFixedT(SURVEY_LANG_TO_LOCALE[language] ?? 'fr');
        const initialQuestions = getCoreQuestions(problem.problemId, {}, fixedT).map(toSurveyQuestion);

        navigate('/survey/new/scratch?source=talescan', {
            state: {
                category,
                initialQuestions,
                language,
            },
        });
    };

    return (
        <TaleDashbaordMainCard className="max-w-[820px] mx-auto py-12 px-8 flex flex-col gap-8">
            <div className="flex items-start gap-4">
                <button
                    onClick={handleBack}
                    aria-label={t('surveyBuilder.taleScan.backAlt')}
                    className="shrink-0 w-10 h-10 rounded-xl border border-gray-200 flex items-center justify-center hover:bg-gray-50 transition-colors"
                >
                    <BsArrowLeft className="text-lg text-gray-900 rtl:-scale-x-100" />
                </button>
                <div className="flex flex-col gap-2">
                    {problem && (
                        <TaleText applyEffect={false} className="block text-xs font-semibold text-gray-400 uppercase tracking-wider">
                            TaleScan · {problem.problemId}
                        </TaleText>
                    )}
                    <TaleText role="business" className="block text-2xl font-bold">
                        {t('surveyBuilder.taleScan.conversation.title')}
                    </TaleText>
                    <span className="block w-20 h-1 rounded-full bg-tale-business" />
                </div>
            </div>

            <div className="border border-gray-200 rounded-2xl overflow-hidden flex flex-col">
                <div className="flex items-center gap-2 px-6 py-4 border-b border-gray-100">
                    <BsStars className="text-tale-business text-lg" />
                    <TaleText applyEffect={false} className="block font-semibold text-gray-900">
                        {t('surveyBuilder.taleScan.conversation.assistantLabel')}
                    </TaleText>

                </div>

                <div className="flex flex-col gap-4 max-h-[400px] overflow-y-auto px-6 py-6">
                    {messages.map((m, i) => (
                        <ChatBubble key={i} role={m.role} text={m.text} />
                    ))}
                </div>

                <div className="flex items-center gap-2 px-6 py-4 border-t border-gray-100 bg-gray-50">
                    <input
                        type="text"
                        value={draft}
                        onChange={(e) => setDraft(e.target.value)}
                        onKeyDown={handleInputKeyDown}
                        placeholder={t('surveyBuilder.taleScan.conversation.inputPlaceholder')}
                        className="flex-1 rounded-xl border border-gray-200 bg-white px-4 py-2.5 text-sm text-gray-900"
                    />
                    <button
                        onClick={handleSend}
                        disabled={!draft.trim()}
                        className="shrink-0 w-10 h-10 rounded-xl bg-tale-business text-white flex items-center justify-center disabled:bg-white disabled:border disabled:border-gray-200 disabled:text-gray-300 transition-colors"
                        aria-label={t('surveyBuilder.taleScan.conversation.sendAlt')}
                    >
                        <BsSend className="text-sm" />
                    </button>
                </div>
            </div>

            <button
                onClick={handleGenerate}
                disabled={isGenerating}
                className="self-center rounded-xl bg-tale-business text-white font-semibold px-8 py-3 hover:opacity-90 transition-opacity disabled:opacity-60"
            >
                {t('surveyBuilder.taleScan.conversation.generateButton')}
            </button>
        </TaleDashbaordMainCard>
    );
}