/**
 * PatientHeader - Composant d'en-tête avec informations patient et séjour
 * 
 * Responsabilités:
 * - Afficher les informations patient (âge, sexe, IMC)
 * - Afficher les informations de séjour (dates, durée, spécialité)
 * - Gérer les valeurs manquantes ("Non renseigné")
 * - Anonymiser l'identifiant patient (4 derniers caractères)
 * - Calculer l'âge, l'IMC et la durée du séjour
 * 
 * Requirements: 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 2.10
 */

class PatientHeader {
    constructor(stateManager) {
        this.stateManager = stateManager;
        this.container = null;
        
        this.init();
    }
    
    /**
     * Initialise le composant
     */
    init() {
        this.container = document.getElementById('patient-header');
        if (!this.container) {
            console.error('Patient header container not found');
            return;
        }
        
        // S'abonner aux changements de séjour
        this.stateManager.on('stayChanged', (stay) => this.render(stay));
        
        // Rendre l'en-tête initial si un séjour est déjà chargé
        const currentStay = this.stateManager.getCurrentStay();
        if (currentStay) {
            this.render(currentStay);
        }
    }
    
    /**
     * Calcule l'âge à partir de la date de naissance
     * Validates: Requirements 2.2
     * 
     * @param {Date|string} birthDate - Date de naissance
     * @param {number} ageFromServer - Âge déjà calculé par le serveur (optionnel)
     * @returns {number} Âge en années
     */
    calculateAge(birthDate, ageFromServer = null) {
        // Si l'âge est déjà fourni par le serveur, l'utiliser
        if (ageFromServer !== null && ageFromServer !== undefined) {
            return ageFromServer;
        }
        
        if (!birthDate) {
            return null;
        }
        
        const birth = new Date(birthDate);
        const today = new Date();
        
        let age = today.getFullYear() - birth.getFullYear();
        const monthDiff = today.getMonth() - birth.getMonth();
        
        // Ajuster si l'anniversaire n'est pas encore passé cette année
        if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birth.getDate())) {
            age--;
        }
        
        return age;
    }
    
    /**
     * Calcule l'IMC (Indice de Masse Corporelle)
     * Validates: Requirements 2.4
     * 
     * @param {number} weight - Poids en kg
     * @param {number} height - Taille en mètres
     * @returns {number} IMC arrondi à 1 décimale
     */
    calculateBMI(weight, height) {
        if (!weight || !height || height === 0) {
            return null;
        }
        
        const bmi = weight / (height * height);
        return Math.round(bmi * 10) / 10;
    }
    
    /**
     * Calcule la durée du séjour en jours
     * Validates: Requirements 2.6
     * 
     * @param {Date|string} admissionDate - Date d'admission
     * @param {Date|string} dischargeDate - Date de sortie
     * @returns {number} Durée en jours
     */
    calculateStayDuration(admissionDate, dischargeDate) {
        if (!admissionDate || !dischargeDate) {
            return null;
        }
        
        const admission = new Date(admissionDate);
        const discharge = new Date(dischargeDate);
        
        const diffTime = discharge.getTime() - admission.getTime();
        const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
        
        return diffDays;
    }
    
    /**
     * Anonymise l'identifiant patient (affiche seulement les 4 derniers caractères)
     * Validates: Requirements 2.10
     * 
     * @param {string} patientId - Identifiant patient complet
     * @returns {string} Identifiant anonymisé
     */
    anonymizePatientId(patientId) {
        if (!patientId || patientId.length <= 4) {
            return patientId || 'Non renseigné';
        }
        
        const lastFour = patientId.slice(-4);
        const masked = '•'.repeat(Math.max(0, patientId.length - 4));
        return `${masked}${lastFour}`;
    }
    
    /**
     * Formate une valeur avec gestion des valeurs manquantes
     * Validates: Requirements 2.9
     * 
     * @param {*} value - Valeur à formater
     * @param {string} suffix - Suffixe optionnel (ex: "ans", "kg")
     * @returns {string} Valeur formatée ou "Non renseigné"
     */
    formatValue(value, suffix = '') {
        if (value === null || value === undefined || value === '') {
            return 'Non renseigné';
        }
        
        return suffix ? `${value} ${suffix}` : String(value);
    }
    
    /**
     * Formate une date au format français
     * 
     * @param {Date|string} date - Date à formater
     * @returns {string} Date formatée (JJ/MM/AAAA)
     */
    formatDate(date) {
        if (!date) {
            return 'Non renseigné';
        }
        
        const d = new Date(date);
        const day = String(d.getDate()).padStart(2, '0');
        const month = String(d.getMonth() + 1).padStart(2, '0');
        const year = d.getFullYear();
        
        return `${day}/${month}/${year}`;
    }
    
    /**
     * Rend l'en-tête avec les informations du séjour
     * Validates: Requirements 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 2.10
     * 
     * @param {Object} stay - Données du séjour
     */
    render(stay) {
        if (!stay || !this.container) {
            return;
        }
        
        console.log('PatientHeader.render() called with stay:', stay);
        
        const patient = stay.patient || {};
        const admission = stay.admission || {};
        const discharge = stay.discharge || {};
        
        // Calculer les valeurs dérivées
        // Utiliser l'âge du séjour s'il est disponible, sinon calculer depuis birthDate
        const age = stay.age !== null && stay.age !== undefined ? stay.age : this.calculateAge(patient.birthDate);
        const bmi = this.calculateBMI(patient.weight, patient.height);
        const duration = this.calculateStayDuration(admission.date, discharge.date);
        const anonymizedId = this.anonymizePatientId(patient.id);
        
        console.log('PatientHeader values:', {
            age: age,
            sex: patient.sex,
            bmi: bmi,
            duration: duration,
            anonymizedId: anonymizedId
        });
        
        // Construire le HTML
        const html = `
            <div class="patient-header-content">
                <div class="patient-info-section">
                    <h2 class="section-title">Informations Patient</h2>
                    <div class="info-grid">
                        <div class="info-item">
                            <span class="info-label">Identifiant:</span>
                            <span class="info-value">${anonymizedId}</span>
                        </div>
                        <div class="info-item">
                            <span class="info-label">Âge:</span>
                            <span class="info-value">${this.formatValue(age, 'ans')}</span>
                        </div>
                        <div class="info-item">
                            <span class="info-label">Sexe:</span>
                            <span class="info-value">${this.formatValue(patient.sex)}</span>
                        </div>
                        <div class="info-item">
                            <span class="info-label">IMC:</span>
                            <span class="info-value">${this.formatValue(bmi, 'kg/m²')}</span>
                        </div>
                    </div>
                </div>
                
                <div class="stay-info-section">
                    <h2 class="section-title">Informations Séjour</h2>
                    <div class="info-grid">
                        <div class="info-item">
                            <span class="info-label">Admission:</span>
                            <span class="info-value">${this.formatDate(admission.date)}</span>
                        </div>
                        <div class="info-item">
                            <span class="info-label">Sortie:</span>
                            <span class="info-value">${this.formatDate(discharge.date)}</span>
                        </div>
                        <div class="info-item">
                            <span class="info-label">Durée:</span>
                            <span class="info-value">${this.formatValue(duration, 'jours')}</span>
                        </div>
                        <div class="info-item">
                            <span class="info-label">Spécialité:</span>
                            <span class="info-value">${this.formatValue(admission.specialty)}</span>
                        </div>
                        <div class="info-item">
                            <span class="info-label">Mode d'entrée:</span>
                            <span class="info-value">${this.formatValue(admission.mode)}</span>
                        </div>
                        <div class="info-item">
                            <span class="info-label">Mode de sortie:</span>
                            <span class="info-value">${this.formatValue(discharge.mode)}</span>
                        </div>
                    </div>
                </div>
            </div>
        `;
        
        this.container.innerHTML = html;
    }
    
    /**
     * Efface l'en-tête
     */
    clear() {
        if (this.container) {
            this.container.innerHTML = '';
        }
    }
}

// Export pour utilisation dans d'autres modules
if (typeof module !== 'undefined' && module.exports) {
    module.exports = PatientHeader;
}
