// ECO-PANNEAU.FR - _react/delegate/_delegate_view.jsx

// 1. - COMPOSANT PRINCIPAL : SAISIE DÉLÉGUÉE
window.pano_DelegateView = ({ token, showToast }) => {
    const { useState, useEffect } = React;
    
    // ZÉRO-DETTE : Utilisation de notre Hook abstrait !
    const { isMounted, safeFetch } = window.pano_useSafeFetch();

    const [panneau, setPanneau] = useState(null);
    const [loading, setLoading] = useState(true);
    const [isSaving, setIsSaving] = useState(false);
    const [error, setError] = useState(null);
    const [editingEntity, setEditingEntity] = useState(null);
    const [confirmDialog, setConfirmDialog] = useState(null);

    // 2. - Composants et Icônes
    const { LoaderIcon, AlertTriangleIcon, ShieldIcon, CheckCircleIcon } = window.pano_getIcons();
    const { ConfirmModal, Button, PanneauEditorForm, EntityEditorModal } = window.pano_getComponents();

    // 3. - Cycle de vie et requêtes
    useEffect(() => {
        // Fetch natif conservé ici car il s'agit d'une initialisation sans jeton d'authentification classique
        fetch(window.pano_CONFIG.apiBaseUrl + 'panneaux/delegated_access&token=' + encodeURIComponent(token) + '&_t=' + Date.now())
            .then(r => r.json())
            .then(d => {
                if (!isMounted.current) return; // SÉCURITÉ : Coupe-circuit
                
                if (d.status === 'success') {
                    setPanneau(d.data);
                } else {
                    setError(d.message);
                }
                setLoading(false);
            })
            .catch((e) => {
                if (!isMounted.current) return; // SÉCURITÉ : Coupe-circuit
                
                if (window.pano_logFallback) window.pano_logFallback("Erreur fetch delegation: " + e.message);
                setError("Erreur réseau");
                setLoading(false);
            });
    }, [token, isMounted]);

    const handleSave = async () => {
        const d = await safeFetch('panneaux/delegated_update', {
            body: { token, ...panneau },
            setLoading: setIsSaving,
            successMessage: "Informations enregistrées avec succès."
        });
        
        // La gestion de isMounted pour setIsSaving est déjà incluse dans safeFetch
    };

    // 4. - Rendu UI : États de chargement et erreurs
    if (loading) {
        return (
            <div className="h-screen flex flex-col items-center justify-center bg-slate-50">
                {LoaderIcon && <LoaderIcon className="animate-spin text-emerald-600 mb-4 w-8 h-8" />}
                <p className="font-bold text-slate-500 uppercase tracking-widest text-sm break-words text-center px-4">Vérification de l'accès...</p>
            </div>
        );
    }

    if (error) {
        return (
            <div className="h-screen flex items-center justify-center bg-slate-50 p-4">
                <div className="bg-white p-8 rounded-3xl shadow-xl border border-red-200 text-center max-w-md w-full">
                    {AlertTriangleIcon && <AlertTriangleIcon className="w-12 h-12 text-red-500 mx-auto mb-4" />}
                    <h2 className="text-xl font-black text-slate-800 mb-2 break-words leading-tight">Accès refusé</h2>
                    <p className="text-slate-500 break-words leading-relaxed">{error}</p>
                </div>
            </div>
        );
    }

    // 5. - Rendu UI : Éditeur délégué
    return (
        <div className="min-h-screen bg-slate-50 flex flex-col overflow-x-hidden">
            <header className="bg-white border-b border-slate-200 py-4 px-6 flex justify-between items-center sticky top-0 z-50 shadow-sm shrink-0">
                <div className="min-w-0 pr-4">
                    <h1 className="font-black text-xl text-slate-800 flex items-center gap-2 break-words leading-tight">
                        {ShieldIcon && <ShieldIcon className="w-6 h-6 text-blue-600 shrink-0"/>} Saisie déléguée
                    </h1>
                    <p className="text-xs text-slate-500 break-words mt-1 leading-tight">Mise à jour des informations du panneau</p>
                </div>
                {Button && (
                    <Button variant="infoSolid" icon={isSaving ? LoaderIcon : CheckCircleIcon} onClick={handleSave} disabled={isSaving} className="px-6 py-2.5 shrink-0">
                        <span className="hidden sm:inline">Enregistrer</span>
                    </Button>
                )}
            </header>
            
            <main className="flex-1 max-w-4xl w-full mx-auto p-4 sm:p-8">
                <div className="bg-blue-50 border border-blue-200 rounded-2xl p-5 mb-8 text-blue-800 text-sm font-medium leading-relaxed break-words shadow-sm">
                    Vous avez été invité à compléter les informations légales de ce panneau (intervenants, sous-traitants, PDF de l'arrêté). Vos modifications seront directement répercutées sur l'affichage public.
                </div>
                
                {PanneauEditorForm && (
                    <PanneauEditorForm 
                        panneau={panneau} 
                        setPanneau={setPanneau} 
                        managingPanneau={panneau} 
                        originalPanneau={panneau}
                        onCancel={() => window.location.href = '?'} 
                        onPublish={handleSave} 
                        onEditEntity={(loc, data) => setEditingEntity({location: loc, data})}
                        deleteEntity={(loc) => {
                            setConfirmDialog({
                                title: "Supprimer l'élément",
                                message: "Êtes-vous sûr de vouloir supprimer cet élément de l'équipe ?",
                                confirmText: "Supprimer",
                                type: "error",
                                isDestructive: true,
                                onConfirm: () => {
                                    let newInter = [...(panneau.intervenants || [])];
                                    let newLots = JSON.parse(JSON.stringify(panneau.lots || []));
                                    
                                    if (loc.type === 'intervenant') {
                                        newInter.splice(loc.index, 1);
                                    } else if (loc.type === 'lot') {
                                        newLots.splice(loc.index, 1);
                                    } else {
                                        newLots[loc.lotIndex].entreprises.splice(loc.index, 1);
                                    }
                                    
                                    setPanneau({ ...panneau, intervenants: newInter, lots: newLots });
                                    setConfirmDialog(null);
                                },
                                onCancel: () => setConfirmDialog(null)
                            });
                        }}
                        isSaving={isSaving} 
                        currentUserRole="delegate" 
                        lockedFields={panneau.lockedFields || []}
                        showToast={showToast}
                    />
                )}
            </main>
            
            {editingEntity && EntityEditorModal && (
                <EntityEditorModal 
                    editingEntity={editingEntity} 
                    setEditingEntity={setEditingEntity} 
                    saveEditedEntity={() => {
                        let newInter = [...(panneau.intervenants || [])];
                        let newLots = JSON.parse(JSON.stringify(panneau.lots || []));
                        const loc = editingEntity.location;
                        
                        // CORRECTION SÉCURITÉ : Utilisation du générateur d'ID avec fallback
                        if (loc.type === 'intervenant') { 
                            if (loc.index !== undefined) {
                                newInter[loc.index] = editingEntity.data; 
                            } else {
                                newInter.push({...editingEntity.data, id: window.pano_generateID()}); 
                            }
                        } else if (loc.type === 'lot') { 
                            if (loc.index !== undefined) {
                                newLots[loc.index] = {...newLots[loc.index], ...editingEntity.data}; 
                            } else {
                                newLots.push({...editingEntity.data, id: window.pano_generateID(), entreprises: []}); 
                            }
                        } else if (loc.type === 'entreprise') { 
                            if (loc.index !== undefined) {
                                newLots[loc.lotIndex].entreprises[loc.index] = editingEntity.data; 
                            } else {
                                newLots[loc.lotIndex].entreprises.push({...editingEntity.data, id: window.pano_generateID()}); 
                            }
                        }
                        
                        setPanneau({ ...panneau, intervenants: newInter, lots: newLots });
                        setEditingEntity(null);
                    }} 
                    clientUid={panneau?.client_uid}
                    panneauId={panneau?.id}
                    onClose={() => setEditingEntity(null)}
                    showToast={showToast}
                />
            )}

            {confirmDialog && ConfirmModal && (
                <ConfirmModal {...confirmConfig} onCancel={() => setConfirmDialog(null)} />
            )}
        </div>
    );
};

/* EOF ========== [_react/delegate/_delegate_view.jsx] */