# tasks.py
from celery import shared_task
from django.utils import timezone
from Subscriptions.automate import Automate_RF_Register, updateStateMachine
from .models import RegistrationForm
from GestionMessagerie.models import Messagerie
from N3wtSchool import settings, bdd
from N3wtSchool.mailManager import sendMail, getConnection
from django.template.loader import render_to_string
import requests
import logging
logger = logging.getLogger(__name__)

@shared_task
def check_for_signature_deadlines():
    now = timezone.now()
    deadline = now - timezone.timedelta(days=settings.EXPIRATION_DI_NB_DAYS)
    # deadline = now - timezone.timedelta(seconds=settings.EXPIRATION_DI_NB_DAYS)

    dossiers_en_attente = RegistrationForm.objects.filter(etat=RegistrationForm.RegistrationFormStatus.DI_ENVOYE, dateMAJ__lt=deadline)

    for dossier in dossiers_en_attente:
        send_notification(dossier)

def send_notification(dossier):
    logger.debug(f'Dossier en attente.... {dossier} - Positionnement à l\'état TO_BE_FOLLOWED_UP')

    # Changer l'état de l'automate
    updateStateMachine(dossier, 'EVENT_FOLLOW_UP')

    # Envoyer un email de relance aux responsables
    try:
        # Récupérer l'établissement du dossier
        establishment_id = dossier.establishment.id

        # Obtenir la connexion SMTP pour cet établissement
        connection = getConnection(establishment_id)

        # Préparer le contenu de l'email
        subject = f"[RELANCE] Dossier d'inscription en attente - {dossier.eleve.first_name} {dossier.eleve.last_name}"

        context = {
            'student_name': f"{dossier.eleve.first_name} {dossier.eleve.last_name}",
            'deadline_date': (timezone.now() - timezone.timedelta(days=settings.EXPIRATION_DI_NB_DAYS)).strftime('%d/%m/%Y'),
            'establishment_name': dossier.establishment.name,
            'base_url': settings.BASE_URL
        }

        # Utiliser un template HTML pour l'email (si disponible)
        try:
            html_message = render_to_string('emails/relance_signature.html', context)
        except:
            # Si pas de template, message simple
            html_message = f"""
            <html>
            <body>
                <h2>Relance - Dossier d'inscription en attente</h2>
                <p>Bonjour,</p>
                <p>Le dossier d'inscription de <strong>{context['student_name']}</strong> est en attente de signature depuis plus de {settings.EXPIRATION_DI_NB_DAYS} jours.</p>
                <p>Merci de vous connecter à votre espace pour finaliser l'inscription.</p>
                <p>Cordialement,<br>L'équipe {context['establishment_name']}</p>
            </body>
            </html>
            """

        # Récupérer les emails des responsables
        destinataires = []
        profiles = dossier.eleve.profiles.all()
        for profile in profiles:
            if profile.email:
                destinataires.append(profile.email)

        if destinataires:
            # Envoyer l'email
            result = sendMail(
                subject=subject,
                message=html_message,
                recipients=destinataires,
                connection=connection
            )
            logger.info(f"Email de relance envoyé pour le dossier {dossier.id} à {destinataires}")
        else:
            logger.warning(f"Aucun email trouvé pour les responsables du dossier {dossier.id}")

    except Exception as e:
        logger.error(f"Erreur lors de l'envoi de l'email de relance pour le dossier {dossier.id}: {str(e)}")

        # En cas d'erreur email, utiliser la messagerie interne comme fallback
        try:
            url = settings.URL_DJANGO + 'GestionMessagerie/send-message/'

            # Créer ou récupérer une conversation avec chaque responsable
            destinataires = dossier.eleve.profiles.all()
            for destinataire in destinataires:
                message_data = {
                    "conversation_id": None,  # Sera géré par l'API
                    "sender_id": 1,  # ID du système ou admin
                    "content": f"RELANCE pour le dossier d'inscription de {dossier.eleve.first_name} {dossier.eleve.last_name}"
                }

                response = requests.post(url, json=message_data)
                if response.status_code != 201:
                    logger.error(f"Erreur lors de l'envoi du message interne: {response.text}")

        except Exception as inner_e:
            logger.error(f"Erreur lors de l'envoi du message interne de fallback: {str(inner_e)}")

    # subject = f"Dossier d'inscription non signé - {dossier.objet}"
    # message = f"Le dossier d'inscription avec l'objet '{dossier.objet}' n'a pas été signé depuis {dossier.created_at}."
    # send_mail(subject, message, settings.EMAIL_HOST_USER, [dossier.destinataire.email])
