"""
Module d'envoi d'emails d'alerte
Envoie des notifications en cas de problème de sauvegarde
"""
import logging
from datetime import datetime
from auth import graph_auth
from config import EMAIL_CONFIG, get_alert_recipient

logger = logging.getLogger(__name__)

class AlertSender:
    """Gestionnaire d'envoi d'alertes email"""
    
    def __init__(self):
        """Initialise le sender d'alertes"""
        self.base_url = 'https://graph.microsoft.com/v1.0'
        self.from_email = EMAIL_CONFIG['sender_email']
        self.sent_alerts = {}  # Cache pour éviter le spam
        
    def send_alert(self, subject, body, priority='Normal'):
        """
        Envoie un email d'alerte
        
        Args:
            subject: Sujet de l'email
            body: Corps de l'email (HTML)
            priority: Priorité ('Low', 'Normal', 'High')
            
        Returns:
            bool: True si envoi réussi
        """
        try:
            recipient = get_alert_recipient()
            
            # Construire le message
            message = {
                'message': {
                    'subject': subject,
                    'body': {
                        'contentType': 'HTML',
                        'content': body
                    },
                    'toRecipients': [
                        {
                            'emailAddress': {
                                'address': recipient
                            }
                        }
                    ],
                    'importance': priority
                },
                'saveToSentItems': 'true'
            }
            
            # URL pour envoyer depuis la boîte support
            url = f"{self.base_url}/users/{self.from_email}/sendMail"
            
            # Envoyer l'email
            response = graph_auth.make_request('POST', url, json=message)
            
            if response and response.status_code in [200, 202]:
                logger.info(f"Alerte envoyée à {recipient}: {subject}")
                return True
            else:
                logger.error(f"Erreur envoi alerte: {response.status_code if response else 'No response'}")
                return False
                
        except Exception as e:
            logger.error(f"Exception lors de l'envoi d'alerte: {str(e)}")
            return False
    
    def send_failure_alert(self, backup_info):
        """
        Envoie une alerte pour une sauvegarde en échec
        
        Args:
            backup_info: Informations sur la sauvegarde en échec
            
        Returns:
            bool: True si envoi réussi
        """
        # Vérifier si déjà envoyé récemment (éviter le spam)
        alert_key = f"failure_{backup_info['backup_name']}"
        if self.should_skip_alert(alert_key):
            logger.info(f"Alerte déjà envoyée récemment pour {backup_info['backup_name']}")
            return False
        
        subject = f"🔴 ÉCHEC Sauvegarde - {backup_info['backup_name']} ({backup_info['backup_type']})"
        
        body = f"""
        <html>
        <head>
            <style>
                body {{ font-family: Arial, sans-serif; }}
                .alert {{ background-color: #f8d7da; border: 1px solid #f5c6cb; padding: 15px; border-radius: 5px; }}
                .details {{ margin-top: 20px; }}
                .detail-row {{ margin: 10px 0; }}
                .label {{ font-weight: bold; }}
                .footer {{ margin-top: 30px; font-size: 0.9em; color: #666; }}
            </style>
        </head>
        <body>
            <div class="alert">
                <h2>⚠️ Échec de Sauvegarde Détecté</h2>
                <p>Une sauvegarde a échoué et nécessite votre attention.</p>
            </div>
            
            <div class="details">
                <div class="detail-row">
                    <span class="label">Nom de la sauvegarde:</span> {backup_info['backup_name']}
                </div>
                <div class="detail-row">
                    <span class="label">Type:</span> {backup_info['backup_type']}
                </div>
                <div class="detail-row">
                    <span class="label">Date/Heure:</span> {self.format_date(backup_info['received_date'])}
                </div>
                <div class="detail-row">
                    <span class="label">Sujet original:</span> {backup_info['subject']}
                </div>
                {self.format_details(backup_info.get('details', {}))}
            </div>
            
            <div class="footer">
                <p>Cette alerte a été générée automatiquement par le système de monitoring des sauvegardes.</p>
                <p>Veuillez vérifier et résoudre le problème dès que possible.</p>
            </div>
        </body>
        </html>
        """
        
        success = self.send_alert(subject, body, priority='High')
        if success:
            self.mark_alert_sent(alert_key)
        return success
    
    def send_missing_alert(self, missing_backups):
        """
        Envoie une alerte pour les sauvegardes manquantes
        
        Args:
            missing_backups: Dict des sauvegardes manquantes
            
        Returns:
            bool: True si envoi réussi
        """
        if not missing_backups:
            return False
        
        # Vérifier si déjà envoyé récemment
        alert_key = f"missing_{datetime.now().strftime('%Y%m%d')}"
        if self.should_skip_alert(alert_key):
            logger.info("Alerte sauvegardes manquantes déjà envoyée aujourd'hui")
            return False
        
        subject = f"⚠️ ALERTE - {len(missing_backups)} sauvegarde(s) manquante(s)"
        
        # Construire la liste des sauvegardes manquantes
        missing_list = ""
        for name, info in missing_backups.items():
            missing_list += f"""
            <tr>
                <td style="padding: 8px; border: 1px solid #ddd;">{name}</td>
                <td style="padding: 8px; border: 1px solid #ddd;">{info['type']}</td>
                <td style="padding: 8px; border: 1px solid #ddd;">{info['hours_ago']} heures</td>
                <td style="padding: 8px; border: 1px solid #ddd;">{self.format_date(info['last_seen'])}</td>
                <td style="padding: 8px; border: 1px solid #ddd;">{info['last_status']}</td>
            </tr>
            """
        
        body = f"""
        <html>
        <head>
            <style>
                body {{ font-family: Arial, sans-serif; }}
                .alert {{ background-color: #fff3cd; border: 1px solid #ffeeba; padding: 15px; border-radius: 5px; }}
                table {{ width: 100%; border-collapse: collapse; margin-top: 20px; }}
                th {{ background-color: #f8f9fa; padding: 10px; border: 1px solid #ddd; text-align: left; }}
                .footer {{ margin-top: 30px; font-size: 0.9em; color: #666; }}
            </style>
        </head>
        <body>
            <div class="alert">
                <h2>⚠️ Sauvegardes Manquantes</h2>
                <p>Les sauvegardes suivantes n'ont pas été reçues depuis plus de 48 heures:</p>
            </div>
            
            <table>
                <thead>
                    <tr>
                        <th>Nom</th>
                        <th>Type</th>
                        <th>Dernière vue il y a</th>
                        <th>Date dernière sauvegarde</th>
                        <th>Dernier statut</th>
                    </tr>
                </thead>
                <tbody>
                    {missing_list}
                </tbody>
            </table>
            
            <div class="footer">
                <p>Cette alerte a été générée automatiquement par le système de monitoring des sauvegardes.</p>
                <p>Veuillez vérifier que les sauvegardes sont bien configurées et fonctionnelles.</p>
            </div>
        </body>
        </html>
        """
        
        success = self.send_alert(subject, body, priority='High')
        if success:
            self.mark_alert_sent(alert_key)
        return success
    
    def send_summary_report(self, summary_data):
        """
        Envoie un rapport de synthèse quotidien
        
        Args:
            summary_data: Données de synthèse
            
        Returns:
            bool: True si envoi réussi
        """
        subject = f"📊 Rapport Quotidien Sauvegardes - {datetime.now().strftime('%d/%m/%Y')}"
        
        # Calculer les statistiques
        total = summary_data.get('total', 0)
        success = summary_data.get('success', 0)
        failed = summary_data.get('failed', 0)
        missing = len(summary_data.get('missing', {}))
        
        # Couleur selon le statut global
        if failed > 0 or missing > 0:
            status_color = "#dc3545"  # Rouge
            status_text = "⚠️ Attention Requise"
        else:
            status_color = "#28a745"  # Vert
            status_text = "✅ Tout est OK"
        
        body = f"""
        <html>
        <head>
            <style>
                body {{ font-family: Arial, sans-serif; }}
                .header {{ background-color: {status_color}; color: white; padding: 20px; border-radius: 5px; }}
                .stats {{ display: flex; justify-content: space-around; margin: 20px 0; }}
                .stat {{ text-align: center; padding: 15px; background: #f8f9fa; border-radius: 5px; }}
                .stat-value {{ font-size: 2em; font-weight: bold; }}
                .stat-label {{ color: #666; margin-top: 5px; }}
            </style>
        </head>
        <body>
            <div class="header">
                <h2>{status_text}</h2>
                <p>Rapport du {datetime.now().strftime('%d/%m/%Y à %H:%M')}</p>
            </div>
            
            <div class="stats">
                <div class="stat">
                    <div class="stat-value">{total}</div>
                    <div class="stat-label">Total Sauvegardes</div>
                </div>
                <div class="stat">
                    <div class="stat-value" style="color: #28a745;">{success}</div>
                    <div class="stat-label">Réussies</div>
                </div>
                <div class="stat">
                    <div class="stat-value" style="color: #dc3545;">{failed}</div>
                    <div class="stat-label">Échouées</div>
                </div>
                <div class="stat">
                    <div class="stat-value" style="color: #ffc107;">{missing}</div>
                    <div class="stat-label">Manquantes</div>
                </div>
            </div>
            
            {self.format_failed_list(summary_data.get('failed_list', []))}
            {self.format_missing_list(summary_data.get('missing', {}))}
            
        </body>
        </html>
        """
        
        return self.send_alert(subject, body)
    
    def format_date(self, date_str):
        """Formate une date pour l'affichage"""
        try:
            dt = datetime.fromisoformat(date_str.replace('Z', '+00:00'))
            return dt.strftime('%d/%m/%Y à %H:%M')
        except:
            return date_str
    
    def format_details(self, details):
        """Formate les détails additionnels"""
        if not details:
            return ""
        
        html = "<div style='margin-top: 15px;'><strong>Détails additionnels:</strong><ul>"
        for key, value in details.items():
            html += f"<li>{key}: {value}</li>"
        html += "</ul></div>"
        return html
    
    def format_failed_list(self, failed_list):
        """Formate la liste des échecs pour le rapport"""
        if not failed_list:
            return ""
        
        html = "<h3>Sauvegardes en échec:</h3><ul>"
        for backup in failed_list[:5]:  # Limiter à 5
            html += f"<li>{backup['backup_name']} - {backup['backup_type']} - {self.format_date(backup['received_date'])}</li>"
        html += "</ul>"
        return html
    
    def format_missing_list(self, missing_dict):
        """Formate la liste des manquantes pour le rapport"""
        if not missing_dict:
            return ""
        
        html = "<h3>Sauvegardes manquantes (>48h):</h3><ul>"
        for name, info in list(missing_dict.items())[:5]:  # Limiter à 5
            html += f"<li>{name} - Dernière vue il y a {info['hours_ago']}h</li>"
        html += "</ul>"
        return html
    
    def should_skip_alert(self, alert_key):
        """
        Vérifie si une alerte a déjà été envoyée récemment
        
        Args:
            alert_key: Clé unique de l'alerte
            
        Returns:
            bool: True si l'alerte doit être ignorée
        """
        if alert_key in self.sent_alerts:
            last_sent = self.sent_alerts[alert_key]
            # Éviter de renvoyer la même alerte dans les 6 heures
            if (datetime.now() - last_sent).total_seconds() < 21600:
                return True
        return False
    
    def mark_alert_sent(self, alert_key):
        """Marque une alerte comme envoyée"""
        self.sent_alerts[alert_key] = datetime.now()
        
        # Nettoyer les vieilles entrées (>24h)
        cutoff = datetime.now()
        for key in list(self.sent_alerts.keys()):
            if (cutoff - self.sent_alerts[key]).days > 1:
                del self.sent_alerts[key]