// types.ts - Types pour le système de suivi des évaluations avec audit complet et authentification

// Interface User étendue avec authentification Microsoft
export interface User {
    id: string;
    email: string;
    name: string;
    nomComplet: string;
    campus: string | null;
    role: 'formateur' | 'rre' | 'super'|'lecteur';  // ✅ Changé 'admin' en 'super'
    permissions?: {
        peut_valider_evaluations?: boolean;
        peut_gerer_formateurs?: boolean;
        peut_saisir_evaluations?: boolean;
        peut_voir_tous_campus?: boolean;
        peut_exporter_donnees?: boolean;
        peut_usurper_identite?: boolean;
    };
}
// Permissions utilisateur
export interface UserPermissions {
    peut_valider_evaluations: boolean;
    peut_gerer_formateurs: boolean;
    peut_saisir_evaluations: boolean;
    peut_voir_tous_campus: boolean;
    peut_exporter_donnees: boolean;
}

// Entrée d'historique pour l'audit complet
export interface HistoryEntry {
    id: string;
    timestamp: string;
    userId: string;
    userName: string;
    userRole: 'formateur' | 'rre' | 'super' | 'lecteur';   // ✅ Ajout de 'super'
    action: 'creation' | 'Nouvelle Action';    // ✅ Changé 'modification' en 'Nouvelle Action'
    reason: string;
    changes: FieldChange[];
}

// Détail d'un changement de champ
export interface FieldChange {
    field: keyof EvaluationRecord;
    fieldLabel: string;
    oldValue: string;
    newValue: string;
}

// Enregistrement d'évaluation avec historique
export interface EvaluationRecord {
    id: string;
    nom: string;
    prenom: string;
    email: string;
    campus: string;
    campusPromo?: string;
    formation: string;
    nomDip?: string;
    annee?: string;
    autoEvaluation: string;
    evaluationTuteur: string;
    dateAction?: string;
    dateActionRRE?: string;
    commentaireFormateur?: string;
    dateEvalTuteur?: string;
    commentaireRRE?: string;
    commentaire?: string;
    lastUpdate?: string;
    formateurEmail?: string;
    history?: HistoryEntry[];
}

// Labels français pour les champs
export const FIELD_LABELS: Record<string, string> = {
    auto_evaluation: 'Auto-évaluation',
    evaluation_tuteur: 'Évaluation tuteur',
    date_action: 'Date d\'action formateur',
    date_action_rre: 'Date d\'action RRE',
    commentaire_formateur: 'Commentaire formateur',
    date_eval_tuteur: 'Date évaluation tuteur',
    commentaire_rre: 'Commentaire RRE',
    commentaire: 'Commentaire général',
    autoEvaluation: 'Auto-évaluation',
    evaluationTuteur: 'Évaluation tuteur',
    dateAction: 'Date d\'action formateur',
    dateActionRRE: 'Date d\'action RRE',
    commentaireFormateur: 'Commentaire formateur',
    dateEvalTuteur: 'Date évaluation tuteur',
    commentaireRRE: 'Commentaire RRE'
};

// Fonction utilitaire pour générer un ID unique
export const generateId = (): string => {
    return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
};

// Fonction pour formater une date ISO en format lisible (avec protection)
export const formatDateTime = (isoString: string | null | undefined): string => {
    // Protection contre les valeurs nulles ou undefined
    if (!isoString) {
        return 'Date non disponible';
    }

    try {
        const date = new Date(isoString);

        // Vérifier si la date est valide
        if (isNaN(date.getTime())) {
            console.warn('Date invalide reçue:', isoString);
            return 'Date invalide';
        }

        return new Intl.DateTimeFormat('fr-FR', {
            day: '2-digit',
            month: '2-digit',
            year: 'numeric',
            hour: '2-digit',
            minute: '2-digit',
            second: '2-digit',
        }).format(date);
    } catch (error) {
        console.error('Erreur formatage date:', error, 'Valeur:', isoString);
        return 'Date invalide';
    }
};

// Fonction pour formater une date courte (avec protection)
export const formatDateShort = (isoString: string | null | undefined): string => {
    // Protection contre les valeurs nulles ou undefined
    if (!isoString) {
        return 'Date non disponible';
    }

    try {
        const date = new Date(isoString);

        // Vérifier si la date est valide
        if (isNaN(date.getTime())) {
            console.warn('Date invalide reçue:', isoString);
            return 'Date invalide';
        }

        return new Intl.DateTimeFormat('fr-FR', {
            day: '2-digit',
            month: '2-digit',
            year: 'numeric',
        }).format(date);
    } catch (error) {
        console.error('Erreur formatage date:', error, 'Valeur:', isoString);
        return 'Date invalide';
    }
};

// Fonction pour calculer les différences entre deux versions
export const calculateChanges = (
    oldRecord: Partial<EvaluationRecord>,
    newRecord: Partial<EvaluationRecord>,
    fieldsToCompare: (keyof EvaluationRecord)[]
): FieldChange[] => {
    const changes: FieldChange[] = [];

    for (const field of fieldsToCompare) {
        const oldValue = String(oldRecord[field] ?? '');
        const newValue = String(newRecord[field] ?? '');

        if (oldValue !== newValue) {
            changes.push({
                field,
                fieldLabel: FIELD_LABELS[field] || field,
                oldValue: oldValue || '(vide)',
                newValue: newValue || '(vide)',
            });
        }
    }

    return changes;
};