"""
Module de lecture des emails depuis la boîte checklist@albys.com
Version améliorée pour supporter plusieurs expéditeurs
"""
import logging
from datetime import datetime, timedelta
import json
from auth import graph_auth
from config import EMAIL_CONFIG

logger = logging.getLogger(__name__)

class MailReader:
    """Lecteur d'emails via Microsoft Graph"""
    
    def __init__(self):
        """Initialise le lecteur d'emails"""
        self.base_url = 'https://graph.microsoft.com/v1.0'
        self.mailbox = EMAIL_CONFIG['monitored_mailbox']
        
    def get_recent_emails(self, hours=72, sender_filter=None):
        """
        Récupère les emails des dernières heures spécifiées
        
        Args:
            hours: Nombre d'heures dans le passé (défaut: 72)
            sender_filter: Adresse email de l'expéditeur ou None pour tous
            
        Returns:
            list: Liste des emails ou liste vide si erreur
        """
        try:
            # Calculer la date de début
            start_date = datetime.utcnow() - timedelta(hours=hours)
            date_filter = start_date.strftime('%Y-%m-%dT%H:%M:%SZ')
            
            # Construire le filtre
            if sender_filter:
                # Filtre avec expéditeur spécifique
                filter_query = f"receivedDateTime ge {date_filter} and from/emailAddress/address eq '{sender_filter}'"
            else:
                # Pas de filtre sur l'expéditeur - récupère TOUS les emails
                filter_query = f"receivedDateTime ge {date_filter}"
            
            # Construire l'URL avec filtre et tri
            url = f"{self.base_url}/users/{self.mailbox}/messages"
            params = {
                '$filter': filter_query,
                '$orderby': 'receivedDateTime desc',
                '$top': 100,
                '$select': 'id,subject,body,receivedDateTime,from'
            }
            
            logger.info(f"Filtre appliqué: {filter_query}")
            
            response = graph_auth.make_request('GET', url, params=params)
            
            if response and response.status_code == 200:
                data = response.json()
                emails = data.get('value', [])
                
                # Log des expéditeurs uniques pour debug
                unique_senders = set()
                for email in emails:
                    sender = email.get('from', {}).get('emailAddress', {}).get('address', 'unknown')
                    unique_senders.add(sender)
                
                logger.info(f"Récupéré {len(emails)} emails des {hours} dernières heures")
                logger.info(f"Expéditeurs trouvés: {', '.join(unique_senders)}")
                
                return emails
            else:
                logger.error(f"Erreur lors de la récupération des emails: {response.status_code if response else 'No response'}")
                return []
                
        except Exception as e:
            logger.error(f"Exception lors de la récupération des emails: {str(e)}")
            return []
    
    def get_recent_emails_multiple_senders(self, hours=72, senders=None):
        """
        Récupère les emails de plusieurs expéditeurs
        
        Args:
            hours: Nombre d'heures dans le passé
            senders: Liste d'adresses email ou None pour tous
            
        Returns:
            list: Liste combinée des emails
        """
        try:
            if not senders:
                # Si pas de liste d'expéditeurs, récupérer tous les emails
                return self.get_recent_emails(hours, sender_filter=None)
            
            all_emails = []
            seen_ids = set()
            
            # Récupérer pour chaque expéditeur
            for sender in senders:
                logger.info(f"Récupération des emails de: {sender}")
                emails = self.get_recent_emails(hours, sender_filter=sender)
                
                # Éviter les doublons
                for email in emails:
                    email_id = email.get('id')
                    if email_id not in seen_ids:
                        all_emails.append(email)
                        seen_ids.add(email_id)
            
            logger.info(f"Total récupéré: {len(all_emails)} emails uniques")
            return all_emails
            
        except Exception as e:
            logger.error(f"Exception lors de la récupération multi-expéditeurs: {str(e)}")
            return []
    
    def list_recent_senders(self, hours=168):
        """
        Liste tous les expéditeurs récents pour diagnostic
        
        Args:
            hours: Nombre d'heures à analyser (défaut 7 jours)
            
        Returns:
            dict: Dictionnaire {adresse: nombre d'emails}
        """
        try:
            # Récupérer TOUS les emails sans filtre d'expéditeur
            emails = self.get_recent_emails(hours, sender_filter=None)
            
            senders = {}
            for email in emails:
                sender = email.get('from', {}).get('emailAddress', {}).get('address', 'unknown')
                senders[sender] = senders.get(sender, 0) + 1
            
            return senders
            
        except Exception as e:
            logger.error(f"Exception lors du listing des expéditeurs: {str(e)}")
            return {}
    
    def get_all_backup_emails(self, days=60):
        """
        Récupère tous les emails de sauvegarde des X derniers jours
        SANS filtre sur l'expéditeur
        
        Args:
            days: Nombre de jours d'historique (défaut: 60 pour 2 mois)
            
        Returns:
            list: Liste de tous les emails de sauvegarde
        """
        try:
            all_emails = []
            
            # Calculer la date de début
            start_date = datetime.utcnow() - timedelta(days=days)
            date_filter = start_date.strftime('%Y-%m-%dT%H:%M:%SZ')
            
            # URL de base avec filtre SANS restriction d'expéditeur
            url = f"{self.base_url}/users/{self.mailbox}/messages"
            
            # Pagination pour récupérer tous les emails
            next_link = url
            params = {
                '$filter': f"receivedDateTime ge {date_filter}",  # Pas de filtre from/
                '$orderby': 'receivedDateTime desc',
                '$top': 50,
                '$select': 'id,subject,body,receivedDateTime,from'
            }
            
            while next_link:
                if next_link == url:
                    response = graph_auth.make_request('GET', next_link, params=params)
                else:
                    response = graph_auth.make_request('GET', next_link)
                
                if response and response.status_code == 200:
                    data = response.json()
                    emails = data.get('value', [])
                    all_emails.extend(emails)
                    
                    # Vérifier s'il y a une page suivante
                    next_link = data.get('@odata.nextLink')
                    
                    logger.info(f"Récupéré {len(emails)} emails, total: {len(all_emails)}")
                else:
                    logger.error(f"Erreur lors de la récupération d'une page d'emails")
                    break
            
            logger.info(f"Total de {len(all_emails)} emails récupérés sur {days} jours")
            return all_emails
            
        except Exception as e:
            logger.error(f"Exception lors de la récupération de tous les emails: {str(e)}")
            return []
    
    # ... (garder les autres méthodes inchangées)
    
    def get_email_by_id(self, email_id):
        """Récupère un email spécifique par son ID"""
        try:
            url = f"{self.base_url}/users/{self.mailbox}/messages/{email_id}"
            response = graph_auth.make_request('GET', url)
            
            if response and response.status_code == 200:
                return response.json()
            else:
                logger.error(f"Erreur lors de la récupération de l'email {email_id}")
                return None
                
        except Exception as e:
            logger.error(f"Exception lors de la récupération de l'email {email_id}: {str(e)}")
            return None
    
    def mark_email_as_read(self, email_id):
        """Marque un email comme lu"""
        try:
            url = f"{self.base_url}/users/{self.mailbox}/messages/{email_id}"
            data = {'isRead': True}
            
            response = graph_auth.make_request('PATCH', url, json=data)
            
            if response and response.status_code == 200:
                logger.info(f"Email {email_id} marqué comme lu")
                return True
            else:
                logger.error(f"Erreur lors du marquage de l'email {email_id}")
                return False
                
        except Exception as e:
            logger.error(f"Exception lors du marquage de l'email: {str(e)}")
            return False
    
    def test_mailbox_access(self):
        """Teste l'accès à la boîte mail"""
        try:
            emails = self.get_recent_emails(1)
            
            if emails is not None:
                logger.info(f"Accès à la boîte mail {self.mailbox} réussi")
                return True
            else:
                logger.error(f"Impossible d'accéder à la boîte mail {self.mailbox}")
                return False
                
        except Exception as e:
            logger.error(f"Exception lors du test d'accès: {str(e)}")
            return False