/**
 * =========================================================================
 * PLATEFORME ECO-PANNEAU.FR - VERSION 1.0.0
 * Composant : Générateur d'archives sécurisées (D.O.E et RGPD)
 * =========================================================================
 */

const { useState, useEffect, useRef } = React;

window.ArchiveGeneratorModal = ({ type, panelId, onClose, showToast, refreshData }) => {
    const { Lock, Download, CheckCircle, AlertTriangle, Loader, Copy, Mail } = window;
    
    const [step, setStep] = useState('generating');
    const [progress, setProgress] = useState(0);
    const [result, setResult] = useState(null);
    const [errorMessage, setErrorMessage] = useState('');
    const [sendingEmail, setSendingEmail] = useState(false);
    const [copied, setCopied] = useState(false);

    // CORRECTION : Verrou strict pour empêcher la boucle infinie de requêtes
    const hasFetched = useRef(false);

    useEffect(() => {
        // Si la requête a déjà été lancée pour cette modale, on stoppe net
        if (hasFetched.current) return;
        hasFetched.current = true;

        let currentProgress = 0;
        
        const interval = setInterval(() => {
            currentProgress += (90 - currentProgress) * 0.1;
            setProgress(currentProgress);
        }, 500);

        const endpoint = type === 'rgpd' ? 'archives/rgpd' : 'archives/doe';
        const body = type === 'rgpd' ? {} : { id: panelId };

        fetch(window.ECO_CONFIG.apiBaseUrl + endpoint, {
            method: 'POST',
            headers: { 
                'Content-Type': 'application/json' 
            },
            body: JSON.stringify(body)
        })
        .then(res => res.json())
        .then(d => {
            clearInterval(interval);
            setProgress(100);
            
            if (d.status === 'success') {
                setResult(d.data);
                setStep('done');
                // Ce rafraîchissement ne relancera plus la boucle
                if (refreshData) {
                    refreshData();
                }
            } else {
                setErrorMessage(d.message || "Erreur lors de la génération.");
                setStep('error');
            }
        })
        .catch(e => {
            clearInterval(interval);
            setErrorMessage("Erreur de connexion réseau.");
            setStep('error');
        });

        return () => clearInterval(interval);
    }, [type, panelId]); // CORRECTION : refreshData retiré des dépendances !

    const handleCopy = () => {
        if (!result || !result.password) {
            return;
        }
        
        navigator.clipboard.writeText(result.password).then(() => {
            setCopied(true);
            if (showToast) {
                showToast("Mot de passe copié !");
            }
            setTimeout(() => setCopied(false), 2000);
        });
    };

    const handleSendEmail = async () => {
        if (!result) {
            return;
        }
        
        setSendingEmail(true);
        
        try {
            const res = await fetch(window.ECO_CONFIG.apiBaseUrl + 'archives/send_password', {
                method: 'POST',
                headers: { 
                    'Content-Type': 'application/json' 
                },
                body: JSON.stringify({ 
                    filename: result.filename, 
                    password: result.password 
                })
            });
            
            const d = await res.json();
            
            if (d.status === 'success') {
                if (showToast) {
                    showToast("Mot de passe envoyé par e-mail avec succès.", "success");
                }
            } else {
                if (showToast) {
                    showToast(d.message, "error");
                }
            }
        } catch (e) {
            if (showToast) {
                showToast("Erreur lors de l'envoi de l'e-mail.", "error");
            }
        }
        
        setSendingEmail(false);
    };

    return (
        <window.Modal 
            title={type === 'rgpd' ? "Export de vos données (RGPD)" : "Clôture et archive D.O.E"} 
            onClose={onClose} 
            preventClose={step === 'generating'}
        >
            <div className="space-y-6 text-center">
                {step === 'generating' && (
                    <div className="py-8 space-y-6">
                        <Loader size={48} className="animate-spin text-emerald-600 mx-auto" />
                        <div>
                            <h3 className="text-lg font-black text-slate-800">Création de l'archive sécurisée...</h3>
                            <p className="text-sm text-slate-500 mt-2 font-medium">Chiffrement AES-256 de vos documents en cours. Veuillez patienter.</p>
                        </div>
                        <div className="w-full bg-slate-100 rounded-full h-3 overflow-hidden">
                            <div className="bg-emerald-500 h-full transition-all duration-300 ease-out" style={{ width: `${progress}%` }}></div>
                        </div>
                    </div>
                )}

                {step === 'error' && (
                    <div className="py-8 space-y-4">
                        <div className="w-16 h-16 bg-red-100 text-red-600 rounded-full flex items-center justify-center mx-auto mb-4">
                            <AlertTriangle size={32} />
                        </div>
                        <h3 className="text-xl font-black text-slate-800">Échec de la génération</h3>
                        <p className="text-sm text-slate-600 font-medium">{errorMessage}</p>
                        <button 
                            onClick={onClose} 
                            className="mt-4 px-6 py-3 bg-slate-100 text-slate-700 font-bold rounded-xl hover:bg-slate-200 transition"
                        >
                            Fermer
                        </button>
                    </div>
                )}

                {step === 'done' && result && (
                    <div className="space-y-6 animate-in fade-in slide-in-from-bottom-4">
                        <div className="bg-emerald-50 text-emerald-800 p-5 rounded-2xl border border-emerald-200 text-sm leading-relaxed">
                            <p className="font-black mb-3 flex items-center justify-center gap-2">
                                <CheckCircle size={20}/> Archive chiffrée avec succès
                            </p>
                            <p>Vos données ont été regroupées dans une archive ZIP protégée par un mot de passe unique.</p>
                            <p className="mt-3 font-bold text-red-600">Copiez ce mot de passe avant de télécharger l'archive, il ne sera plus jamais affiché.</p>
                        </div>
                        
                        <div className="bg-slate-100 p-6 rounded-2xl border border-slate-200 shadow-inner relative group">
                            <p className="text-xs text-slate-500 font-bold uppercase tracking-widest mb-3">
                                Nom du fichier : <span className="text-slate-700">{result.filename}</span>
                            </p>
                            <p className="text-3xl font-mono font-black text-slate-800 select-all tracking-wider">
                                {result.password}
                            </p>
                            <div className="mt-6 flex flex-col sm:flex-row items-center justify-center gap-3">
                                <button 
                                    onClick={handleCopy} 
                                    className={`flex w-full sm:w-auto justify-center items-center gap-2 px-4 py-2.5 rounded-xl font-bold text-sm transition ${copied ? 'bg-emerald-600 text-white' : 'bg-white border border-slate-300 text-slate-700 hover:bg-slate-50 shadow-sm'}`}
                                >
                                    {copied ? <CheckCircle size={16}/> : <Copy size={16}/>} {copied ? 'Copié !' : 'Copier le mot de passe'}
                                </button>
                                <button 
                                    onClick={handleSendEmail} 
                                    disabled={sendingEmail} 
                                    className="flex w-full sm:w-auto justify-center items-center gap-2 px-4 py-2.5 bg-white border border-slate-300 text-slate-700 rounded-xl font-bold text-sm hover:bg-slate-50 transition shadow-sm disabled:opacity-50"
                                >
                                    {sendingEmail ? <Loader size={16} className="animate-spin"/> : <Mail size={16}/>} Recevoir par e-mail
                                </button>
                            </div>
                        </div>
                        
                        <div className="flex flex-col sm:flex-row gap-3 mt-4">
                            <button 
                                onClick={onClose} 
                                className="flex-1 bg-slate-100 text-slate-700 py-3 sm:py-4 rounded-xl font-bold hover:bg-slate-200 transition"
                            >
                                Annuler
                            </button>
                            <a 
                                href={`?api=archives/download&file=${result.filename.replace('.zip', '')}`} 
                                onClick={() => setTimeout(onClose, 1000)} 
                                download 
                                className="flex-[2] bg-emerald-600 text-white py-3 sm:py-4 rounded-xl font-black uppercase tracking-widest hover:bg-emerald-700 transition shadow-lg flex items-center justify-center gap-2"
                            >
                                <Download size={18}/> Télécharger l'archive
                            </a>
                        </div>
                    </div>
                )}
            </div>
        </window.Modal>
    );
};

/* EOF ===== [_socle_archives.jsx] =============== */