import { useMemo, useState } from 'react';
import { useNavigate, useParams } from 'react-router-dom';
import { BsArrowLeft, BsX } from 'react-icons/bs';
import { TaleDashbaordMainCard } from '@components/TaleDashbaordMainCard';
import { TaleHoverCard } from '@components/TaleHoverCard';
import { TaleText } from '@components/TaleText';
import { useTranslation } from '@/hooks/useTranslation';
import { getProblemLabels } from './taleScanProblems';
import { DOMAINS, getDomainLabels } from './TaleScanDomains';

/**
 * Popup de choix de langue — TEMPORAIREMENT DÉSACTIVÉE (voir
 * SHOW_LANGUAGE_POPUP plus bas). La logique complète (composant, options,
 * handleLanguageConfirm) reste intacte et fonctionnelle : on en aura besoin
 * quand le choix de langue redevient une étape visible du flow. Ne pas
 * supprimer ce code en attendant, juste basculer le flag.
 */

/**
 * Langues proposées pour le contenu du questionnaire TaleScan.
 * Choix explicite obligatoire (client feedback) — jamais déduit de la
 * langue de l'UI. Les codes matchent com.tale.shared.enums.Language
 * côté backend (ENGLISH/FRENCH/ARABIC/TUNISIAN_ARABIC).
 */
const SURVEY_LANGUAGES = [
    { code: 'ENGLISH', labelKey: 'surveyBuilder.taleScan.languagePicker.options.en' },
    { code: 'FRENCH', labelKey: 'surveyBuilder.taleScan.languagePicker.options.fr' },
    { code: 'ARABIC', labelKey: 'surveyBuilder.taleScan.languagePicker.options.ar' },
    { code: 'TUNISIAN_ARABIC', labelKey: 'surveyBuilder.taleScan.languagePicker.options.derja' },
];

/**
 * Bascule d'affichage du popup de langue. false = on saute directement
 * l'étape (DEFAULT_SURVEY_LANGUAGE est utilisée à la place) ; true = le
 * popup redevient l'étape normale entre la carte problème et la discussion
 * IA. Remettre à true quand le choix multi-langue doit redevenir visible —
 * aucune autre modif de code nécessaire, tout le reste suit automatiquement.
 */
const SHOW_LANGUAGE_POPUP = false;

// Langue utilisée quand SHOW_LANGUAGE_POPUP est false — à retirer une fois
// le popup réactivé. Reprend le comportement historique du site (FR par
// défaut) en attendant.
const DEFAULT_SURVEY_LANGUAGE = 'FRENCH';

/**
 * Popup de choix de langue affichée avant d'entrer dans la discussion avec
 * l'assistant IA. Composant minimal en attendant de le brancher sur le
 * composant modal générique de l'app (ex. TaleModal) si celui-ci existe
 * déjà — à adapter pour rester cohérent avec le style des autres popups de
 * l'espace Business.
 */
function TaleLanguagePickerModal({ onSelect, onClose, t }) {
    return (
        <div
            className="fixed inset-0 z-50 flex items-center justify-center bg-black/40 px-4"
            role="dialog"
            aria-modal="true"
            onClick={onClose}
        >
            <div
                className="bg-white rounded-2xl shadow-xl max-w-md w-full p-7 flex flex-col gap-5"
                onClick={(e) => e.stopPropagation()}
            >
                <div className="flex items-start justify-between gap-4">
                    <TaleText role="business" className="block text-lg font-bold">
                        {t('surveyBuilder.taleScan.languagePicker.title')}
                    </TaleText>
                    <button
                        onClick={onClose}
                        aria-label={t('surveyBuilder.taleScan.languagePicker.closeAlt')}
                        className="shrink-0 w-8 h-8 rounded-lg flex items-center justify-center hover:bg-gray-100 transition-colors"
                    >
                        <BsX className="text-lg text-gray-500" />
                    </button>
                </div>

                <div className="grid grid-cols-2 gap-3">
                    {SURVEY_LANGUAGES.map(({ code, labelKey }) => (
                        <button
                            key={code}
                            onClick={() => onSelect(code)}
                            className="rounded-xl border border-gray-200 py-3 px-4 text-sm font-semibold text-gray-900 hover:border-tale-business hover:bg-gray-50 transition-colors"
                        >
                            {t(labelKey)}
                        </button>
                    ))}
                </div>
            </div>
        </div>
    );
}

/**
 * Écran Problèmes (Niveau 2) — liste des problèmes métier du domaine
 * sélectionné. Mêmes dimensions de conteneur/cartes que TaleScanDomains
 * pour rester cohérent visuellement entre les deux niveaux ; la densité
 * (3 colonnes, pas d'icône, badge gris compact) reste ce qui les différencie.
 *
 * Flow : carte problème → [popup langue si SHOW_LANGUAGE_POPUP] → écran de
 * discussion IA (TaleScanConversation, statique pour l'instant) →
 * /survey/new/scratch. La génération des questions (getCoreQuestions) ne se
 * fait plus ici — elle a été déplacée dans TaleScanConversation.
 */
export default function TaleScanDashboard({ problems = [], basePath = '/scan' }) {
    const navigate = useNavigate();
    const { domainId } = useParams();
    const { t } = useTranslation();

    const domain = useMemo(() => DOMAINS.find((d) => d.domainId === domainId), [domainId]);

    const domainProblems = useMemo(
        () => problems.filter((p) => p.domainId === domainId),
        [problems, domainId]
    );

    // Problème en attente de choix de langue — utilisé seulement quand
    // SHOW_LANGUAGE_POPUP est true.
    const [selectedProblem, setSelectedProblem] = useState(null);

    // Point d'entrée unique vers l'écran de discussion, qu'on y arrive via
    // le popup (langue choisie par l'utilisateur) ou directement (langue
    // par défaut, popup désactivé). handleLanguageConfirm et handleCardClick
    // passent tous les deux par ici — un seul endroit à changer si le
    // contrat de navigation évolue.
    const goToConversation = (problem, language) => {
        navigate(`${basePath}/${domainId}/${problem.problemId}/chat`, {
            state: {
                category: problem.category,
                language, // ← toujours transmis, choisi par l'utilisateur ou par défaut selon SHOW_LANGUAGE_POPUP
            },
        });
    };

    const handleCardClick = (problem) => {
        if (SHOW_LANGUAGE_POPUP) {
            setSelectedProblem(problem); // ouvre la popup au lieu de naviguer direct
        } else {
            goToConversation(problem, DEFAULT_SURVEY_LANGUAGE);
        }
    };

    const handleLanguageConfirm = (language) => {
        // Title is intentionally left blank (client feedback: mandatory,
        // never pre-filled) — no need to resolve the label here at all.
        goToConversation(selectedProblem, language);
        setSelectedProblem(null);
    };

    return (
        <TaleDashbaordMainCard className="max-w-[1320px] mx-auto py-12 px-8 flex flex-col gap-9">
            <div className="flex items-start gap-4">
                <button
                    onClick={() => navigate(basePath)}
                    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">
                    {domain && (
                        <TaleText applyEffect={false} className="block text-xs font-semibold text-gray-400 uppercase tracking-wider">
                            {t('surveyBuilder.taleScan.problems.eyebrow', { domain: getDomainLabels(domain.domainId, t).name })}
                        </TaleText>
                    )}
                    <TaleText role="business" className="block text-2xl font-bold">
                        {t('surveyBuilder.taleScan.problems.title')}
                    </TaleText>
                    <span className="block w-20 h-1 rounded-full bg-tale-business" />
                </div>
            </div>

            <div className="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-5">
                {domainProblems.map((problem) => {
                    const { question, templateName } = getProblemLabels(problem.problemId, t);
                    return (
                        <TaleHoverCard
                            key={problem.problemId}
                            onClick={() => handleCardClick(problem)}
                            className="!w-auto !items-start flex flex-col gap-3 p-7 min-h-[140px] bg-white cursor-pointer"
                        >
                            <TaleText applyEffect={false} className="block font-semibold text-gray-900 leading-snug">
                                {question}
                            </TaleText>
                            <span className="text-xs font-medium px-2.5 py-1 rounded-full bg-gray-100 text-gray-600">
                                {templateName}
                            </span>
                        </TaleHoverCard>
                    );
                })}
            </div>

            <hr className="border-gray-200" />

            <button onClick={() => navigate('/survey/new/ai')} className="text-left flex flex-col gap-0.5 w-fit">
                <TaleText applyEffect={false} className="block text-sm font-semibold text-gray-900">
                    {t('surveyBuilder.taleScan.specificNeed.title')}
                </TaleText>
                <TaleText role="normal" className="block text-sm hover:underline">
                    {t('surveyBuilder.taleScan.specificNeed.link')}
                </TaleText>
            </button>

            {SHOW_LANGUAGE_POPUP && selectedProblem && (
                <TaleLanguagePickerModal
                    t={t}
                    onSelect={handleLanguageConfirm}
                    onClose={() => setSelectedProblem(null)}
                />
            )}
        </TaleDashbaordMainCard>
    );
}