from django.core.mail import EmailMultiAlternatives
from django.template.loader import render_to_string
from django.utils.html import strip_tags
from django.conf import settings
from django.core.signing import Signer
import logging

signer = Signer()
logger = logging.getLogger(__name__)


def send_job_email(to_email, subject, template_name, context):
    """Envoi email HTML à partir d'un template jobs."""
    html_content = render_to_string(template_name, context)
    text_content = strip_tags(html_content)
    from_email = getattr(settings, "EMAIL_HOST_USER", "noreply@senegalacademy.com")
    try:
        msg = EmailMultiAlternatives(subject, text_content, from_email, [to_email])
        msg.attach_alternative(html_content, "text/html")
        msg.send()
        logger.info("Jobs email '%s' sent to %s", subject, to_email)
        return True
    except Exception:
        logger.exception("Erreur envoi email jobs vers %s (sujet=%s)", to_email, subject)
        return False


def send_application_confirmation(application):
    """Après création candidature : confirmation + numéro de dépôt."""
    context = {
        "first_name": application.first_name,
        "last_name": application.last_name,
        "job_title": application.job_offer.title,
        "deposit_number": application.deposit_number,
    }
    return send_job_email(
        application.email,
        f"Senegal Academy – Candidature enregistrée (n° {application.deposit_number})",
        "emails/jobs/confirmation_depot.html",
        context,
    )


def send_application_status_email(application, old_status=None):
    """Envoi selon le statut : validée (avec date début), en attente, non retenu."""
    to_email = application.email
    job_title = application.job_offer.title
    first_name = application.first_name
    last_name = application.last_name
    deposit_number = application.deposit_number

    if application.status == application.Status.VALIDATED:
        start_date_str = application.start_date.strftime("%d/%m/%Y") if application.start_date else ""
        context = {
            "first_name": first_name,
            "last_name": last_name,
            "deposit_number": deposit_number,
            "job_title": job_title,
            "start_date": start_date_str,
        }
        send_job_email(
            to_email,
            f"Senegal Academy – Candidature validée (n° {deposit_number})",
            "emails/jobs/status_validated.html",
            context,
        )
    elif application.status == application.Status.PENDING:
        context = {
            "first_name": first_name,
            "last_name": last_name,
            "deposit_number": deposit_number,
            "job_title": job_title,
        }
        send_job_email(
            to_email,
            f"Senegal Academy – Candidature en cours d'étude (n° {deposit_number})",
            "emails/jobs/status_pending.html",
            context,
        )
    elif application.status == application.Status.REJECTED:
        frontend_url = settings.FRONTEND_URL.rstrip('/')
        subscribe_url = f"{frontend_url}/jobs?subscribe=1&email={to_email}"
        context = {
            "first_name": first_name,
            "last_name": last_name,
            "deposit_number": deposit_number,
            "job_title": job_title,
            "subscribe_url": subscribe_url,
        }
        send_job_email(
            to_email,
            f"Senegal Academy – Réponse à votre candidature (n° {deposit_number})",
            "emails/jobs/status_rejected.html",
            context,
        )


def get_unsubscribe_token(email):
    """Token signé pour le lien de désabonnement (email)."""
    return signer.sign(email)


def get_emails_for_new_offer_notification():
    """Liste d'emails à notifier (utilisateurs + abonnés), sans doublon."""
    from django.contrib.auth import get_user_model
    from .models import JobOfferSubscriber

    User = get_user_model()
    emails = set()
    for u in User.objects.filter(is_active=True, receive_job_offers_notifications=True).values_list("email", flat=True):
        if u:
            emails.add(u)
    for s in JobOfferSubscriber.objects.filter(subscribed=True).values_list("email", flat=True):
        if s:
            emails.add(s)
    return list(emails)


def send_new_offer_notification(offer):
    """Envoie à tous les abonnés (users + JobOfferSubscriber) la notification nouvelle offre."""
    from urllib.parse import quote

    frontend_url = settings.FRONTEND_URL.rstrip('/')
    jobs_page_url = f"{frontend_url}/jobs"
    deadline_str = offer.deadline.strftime("%d/%m/%Y") if offer.deadline else ""

    for email in get_emails_for_new_offer_notification():
        unsubscribe_token = quote(get_unsubscribe_token(email), safe="")
        unsubscribe_url = f"{frontend_url}/jobs/unsubscribe?token={unsubscribe_token}"
        context = {
            "job_title": offer.title,
            "job_post": offer.post,
            "deadline": deadline_str,
            "jobs_page_url": jobs_page_url,
            "unsubscribe_url": unsubscribe_url,
        }
        send_job_email(
            email,
            f"Senegal Academy – Nouvelle offre : {offer.title[:50]}",
            "emails/jobs/new_offer_notification.html",
            context,
        )
