/**
 * PDFExporter - Export PDF côté client avec jsPDF
 * 
 * Responsabilités:
 * - Générer un PDF complet avec tous les codes
 * - Inclure toutes les preuves avec leurs documents sources
 * - Inclure tous les commentaires et corrections
 * - Inclure les scores de confiance et indicateurs de qualité
 * - Inclure les métadonnées du séjour
 * - Télécharger automatiquement le PDF
 * 
 * Validates: Requirements 11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7
 */
class PDFExporter {
  constructor(stateManager) {
    this.stateManager = stateManager;
  }

  /**
   * Exporter le séjour en PDF
   * Validates: Requirements 11.1, 11.2, 11.7
   */
  async exportStay() {
    const stay = this.stateManager.getCurrentStay();
    if (!stay) {
      alert('Aucun séjour chargé');
      return;
    }

    try {
      // Créer le PDF avec jsPDF (si disponible)
      if (typeof jsPDF === 'undefined') {
        // Fallback: appeler l'API backend
        await this.exportViaAPI(stay.stay_id);
        return;
      }

      const doc = new jsPDF();
      let yPos = 20;

      // En-tête
      yPos = this.addHeader(doc, stay, yPos);
      
      // Métadonnées du séjour
      yPos = this.addStayMetadata(doc, stay, yPos);
      
      // Codes proposés
      yPos = this.addCodes(doc, stay, yPos);
      
      // Corrections (si disponibles)
      if (stay.corrections && stay.corrections.length > 0) {
        yPos = this.addCorrections(doc, stay, yPos);
      }
      
      // Télécharger le PDF
      const filename = this.generateFilename(stay.stay_id);
      doc.save(filename);
      
    } catch (error) {
      console.error('Error exporting PDF:', error);
      alert('Erreur lors de l\'export PDF: ' + error.message);
    }
  }

  /**
   * Ajouter l'en-tête du PDF
   */
  addHeader(doc, stay, yPos) {
    doc.setFontSize(18);
    doc.setFont(undefined, 'bold');
    doc.text('Rapport de Codage PMSI', 105, yPos, { align: 'center' });
    
    yPos += 10;
    doc.setFontSize(10);
    doc.setFont(undefined, 'normal');
    doc.text(`Généré le ${new Date().toLocaleDateString('fr-FR')}`, 105, yPos, { align: 'center' });
    
    return yPos + 15;
  }

  /**
   * Ajouter les métadonnées du séjour
   * Validates: Requirements 11.6
   */
  addStayMetadata(doc, stay, yPos) {
    doc.setFontSize(14);
    doc.setFont(undefined, 'bold');
    doc.text('Informations du séjour', 20, yPos);
    
    yPos += 8;
    doc.setFontSize(10);
    doc.setFont(undefined, 'normal');
    
    const metadata = [
      `ID Séjour: ${stay.stay_id}`,
      `Patient: ${this.anonymizePatientId(stay.patient_id)}`,
      `Dates: ${stay.admission_date || 'N/A'} - ${stay.discharge_date || 'N/A'}`,
      `Durée: ${stay.duration || 'N/A'} jours`,
      `Spécialité: ${stay.specialty || 'Non renseignée'}`
    ];
    
    metadata.forEach(line => {
      doc.text(line, 20, yPos);
      yPos += 6;
    });
    
    return yPos + 10;
  }

  /**
   * Ajouter les codes proposés
   * Validates: Requirements 11.2, 11.3, 11.4, 11.5
   */
  addCodes(doc, stay, yPos) {
    doc.setFontSize(14);
    doc.setFont(undefined, 'bold');
    doc.text('Codes proposés', 20, yPos);
    
    yPos += 8;
    
    const codeTypes = ['dp', 'dr', 'das', 'ccam'];
    const typeLabels = {
      'dp': 'Diagnostic Principal',
      'dr': 'Diagnostic Relié',
      'das': 'Diagnostics Associés Significatifs',
      'ccam': 'Actes CCAM'
    };
    
    codeTypes.forEach(type => {
      const codes = stay.codes ? stay.codes.filter(c => c.type === type) : [];
      if (codes.length > 0) {
        // Vérifier si on a besoin d'une nouvelle page
        if (yPos > 250) {
          doc.addPage();
          yPos = 20;
        }
        
        doc.setFontSize(12);
        doc.setFont(undefined, 'bold');
        doc.text(typeLabels[type], 20, yPos);
        yPos += 6;
        
        doc.setFontSize(10);
        doc.setFont(undefined, 'normal');
        
        codes.forEach(code => {
          if (yPos > 270) {
            doc.addPage();
            yPos = 20;
          }
          
          const confidence = Math.round((code.confidence || 0) * 100);
          const evidenceCount = code.evidence ? code.evidence.length : 0;
          
          doc.text(`• ${code.code} - ${code.label}`, 25, yPos);
          yPos += 5;
          doc.text(`  Confiance: ${confidence}% | Preuves: ${evidenceCount}`, 25, yPos);
          yPos += 8;
        });
        
        yPos += 5;
      }
    });
    
    return yPos;
  }

  /**
   * Ajouter les corrections
   * Validates: Requirements 11.4
   */
  addCorrections(doc, stay, yPos) {
    if (yPos > 230) {
      doc.addPage();
      yPos = 20;
    }
    
    doc.setFontSize(14);
    doc.setFont(undefined, 'bold');
    doc.text('Corrections apportées', 20, yPos);
    
    yPos += 8;
    doc.setFontSize(10);
    doc.setFont(undefined, 'normal');
    
    stay.corrections.forEach(correction => {
      if (yPos > 270) {
        doc.addPage();
        yPos = 20;
      }
      
      doc.text(`• ${correction.original_code} → ${correction.corrected_code}`, 25, yPos);
      yPos += 5;
      if (correction.comment) {
        doc.text(`  Commentaire: ${correction.comment}`, 25, yPos);
        yPos += 5;
      }
      yPos += 3;
    });
    
    return yPos;
  }

  /**
   * Générer le nom du fichier PDF
   * Validates: Requirements 11.7
   */
  generateFilename(stayId) {
    const date = new Date().toISOString().split('T')[0];
    return `codage_${stayId}_${date}.pdf`;
  }

  /**
   * Anonymiser l'ID patient
   */
  anonymizePatientId(patientId) {
    if (!patientId || patientId.length < 4) return '****';
    return '****' + patientId.slice(-4);
  }

  /**
   * Export via l'API backend (fallback)
   */
  async exportViaAPI(stayId) {
    const apiClient = new APIClient();
    await apiClient.exportPDF(stayId);
  }
}

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