from usuarios.permissions import IsClubAdmin, IsClubStaff
import json
from datetime import datetime, timezone

from django.shortcuts import render
from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
from mailjet_rest import Client
import os

from rest_framework import status
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import AllowAny
from rest_framework.response import Response
from django.template.loader import render_to_string
from django.conf import settings
from django.core.exceptions import ValidationError
from django.core.validators import validate_email

MAX_FIELD_LENGTH = 5000


def _send_contact_message(
    *,
    payload,
    required_fields,
    template_name,
    subject_name,
    text_lines,
    context_builder,
    recipient,
):
    api_key = settings.MAILJET_API_KEY
    api_secret = settings.MAILJET_API_SECRET
    if not api_key or not api_secret or not recipient:
        return Response(
            {"error": "El envío de correos no está configurado"},
            status=status.HTTP_503_SERVICE_UNAVAILABLE,
        )

    missing_fields = [field for field in required_fields if not str(payload.get(field) or "").strip()]

    if missing_fields:
        return Response(
            {"error": f"{', '.join(missing_fields)} son obligatorios"},
            status=status.HTTP_400_BAD_REQUEST,
        )

    email = payload.get("email")
    try:
        validate_email(email)
    except ValidationError:
        return Response({"error": "El email no es válido"}, status=status.HTTP_400_BAD_REQUEST)

    if any(len(str(value)) > MAX_FIELD_LENGTH for value in payload.values()):
        return Response({"error": "El mensaje es demasiado largo"}, status=status.HTTP_400_BAD_REQUEST)

    mailjet = Client(
        auth=(api_key, api_secret),
        version="v3.1",
    )

    full_name = subject_name(payload)
    html_content = render_to_string(template_name, context_builder(payload))

    data = {
        "Messages": [
            {
                "From": {
                    "Email": settings.MAIL_FROM_EMAIL,
                    "Name": "Sphere Center Pro",
                },
                # El mensaje va al administrador; se responde al remitente vía ReplyTo
                "To": [
                    {
                        "Email": recipient,
                        "Name": "Administrador",
                    }
                ],
                "ReplyTo": {
                    "Email": email,
                    "Name": full_name,
                },
                "Subject": f"Nuevo mensaje de contacto de {full_name}",
                "TextPart": "\n".join(text_lines(payload)),
                "HTMLPart": html_content,
            }
        ]
    }

    try:
        result = mailjet.send.create(data=data)
    except Exception:
        result = None

    if result is None or result.status_code >= 400:
        return Response(
            {"error": "No se pudo enviar el mensaje"},
            status=status.HTTP_502_BAD_GATEWAY,
        )

    return Response(
        {"message": "Mensaje enviado correctamente"},
        status=status.HTTP_200_OK,
    )


# Create your views here.
@swagger_auto_schema(
    method='post',
    operation_description="Envio un nuevo mail",
    tags=["Envio Mail"],
    security=[{'Bearer': []}],
    request_body=openapi.Schema(
        type=openapi.TYPE_OBJECT,
        properties={
            "email": openapi.Schema(type=openapi.TYPE_STRING, description="Email para enviar correo"),
            "name": openapi.Schema(type=openapi.TYPE_STRING, description="Nombre del usuario para enviar correo"),
            "estado_pago": openapi.Schema(type=openapi.TYPE_STRING, description="Estado del pago"),
            "plan_suscripcion": openapi.Schema(type=openapi.TYPE_STRING, description="Plan de suscripción del usuario"),
            "monto": openapi.Schema(type=openapi.TYPE_STRING, description="Monto del pago"),
            "metodo_pago": openapi.Schema(type=openapi.TYPE_STRING, description="Método de pago"),
            "idTrx": openapi.Schema(type=openapi.TYPE_STRING, description="ID de transacción")
        },
    required=["email", "name", "estado_pago", "plan_suscripcion", "monto", "metodo_pago", "idTrx"],
        ),
    responses={
        200: openapi.Response(description="Confirmación de pago enviado con éxito"),
        500: openapi.Response(description="Error desconocido"),
    },
)
@api_view(['POST'])
@permission_classes([IsClubAdmin])
def confirmacionPago(request):
    api_key = settings.MAILJET_API_KEY
    api_secret = settings.MAILJET_API_SECRET

    body = json.loads(request.body)

    email = body.get("email")
    name = body.get("name")
    estado_pago = body.get("estado_pago")
    plan_suscripcion = body.get("plan_suscripcion")
    monto = body.get("monto")
    metodo_pago = body.get("metodo_pago")
    idTrx = body.get("idTrx")

    context = {
        "EMPRESA": "Sphere Center Pro",
        "NOMBRE": name,
        "ESTADO_PAGO": estado_pago,
        "PLAN": plan_suscripcion,
        "PRODUCTO": "",
        "MONTO": monto,
        "FECHA_PAGO": datetime.now(),
        "METODO_PAGO": metodo_pago,
        "REFERENCIA": idTrx,
        "URL_PORTAL": "https://sphere-481401.web.app/",
        "EMAIL_SOPORTE": "contacto@spherepro.com"
    }


    mailjet = Client(auth=(api_key, api_secret), version='v3.1')

    html_content = render_to_string('pago-confirmado.html', context)

    data = {
        'Messages': [
            {
                "From": {
                    "Email": settings.MAIL_FROM_EMAIL,
                    "Name": "Sphere Center Pro"
                },
                "To": [
                    {
                        "Email": email,
                        "Name": name
                    }
                ],
                "Subject": "Confirmación de Pago",
                "TextPart": "Confirmación de Pago",
                "HTMLPart": html_content
            }
        ]
    }

    result = mailjet.send.create(data=data)
    print(result.status_code)
    print(result.json())
    return Response({"message": "Confirmación de pago enviado con éxito", "mailStatus": result.status_code}, status=status.HTTP_200_OK if result.status_code < 400 else status.HTTP_502_BAD_GATEWAY)


@swagger_auto_schema(
    method='post',
    operation_description="Envio un nuevo mail de bienvenido 2",
    tags=["Envio Mail"],
    security=[{'Bearer': []}],
        request_body=openapi.Schema(
            type=openapi.TYPE_OBJECT,
            properties={
                "email": openapi.Schema(type=openapi.TYPE_STRING, description="Email para enviar correo"),
                "name": openapi.Schema(type=openapi.TYPE_STRING, description="Nombre del usuario para enviar correo"),
                "username": openapi.Schema(type=openapi.TYPE_STRING, description="Usuario para enviar correo"),
                "password": openapi.Schema(type=openapi.TYPE_STRING, description="Contraseña para enviar correo")
            },
        required=["email", "name", "username", "password"],
    ),
    responses={
        200: openapi.Response(description="Transacción creada"),
        500: openapi.Response(description="Error desconocido"),
    },
)
@api_view(['POST'])
@permission_classes([IsClubAdmin])
def bienvenidaNew(request):
    api_key = settings.MAILJET_API_KEY
    api_secret = settings.MAILJET_API_SECRET

    body = json.loads(request.body)

    email = body.get("email")
    name = body.get("name")
    username = body.get("username")
    password = body.get("password")

    mailjet = Client(auth=(api_key, api_secret), version='v3.1')

    context = {
        "EMPRESA": "Sphere Center Pro",
        "NOMBRE": name,
        "URL_ACCESO": "https://sphere-481401.web.app/",
        "USUARIO": username,
        "PASSWORD": password,

    }
    html_content = render_to_string('ejemplo.html', context)

    data = {
        'Messages': [
            {
                "From": {
                    "Email": settings.MAIL_FROM_EMAIL,
                    "Name": "Sphere Center Pro"
                },
                "To": [
                    {
                        "Email": email,
                        "Name": name
                    }
                ],
                "Subject": "Bievenida a SportSpherePro",
                "TextPart": "Bievenida a SportSpherePro",
                "HTMLPart": html_content
            }
        ]
    }

    result = mailjet.send.create(data=data)
    print(result.status_code)
    print(result.json())
    return Response({"message": "Correo enviado con éxito", "mailStatus": result.status_code}, status=status.HTTP_200_OK if result.status_code < 400 else status.HTTP_502_BAD_GATEWAY)

@swagger_auto_schema(
    method='post',
    operation_description="Envio mail de bienvenida",
    tags=["Envio Mail"],
    security=[{'Bearer': []}],
    request_body=openapi.Schema(
        type=openapi.TYPE_OBJECT,
        properties={
            "email": openapi.Schema(type=openapi.TYPE_STRING, description="Email para enviar correo"),
            "name": openapi.Schema(type=openapi.TYPE_STRING, description="Nombre del usuario para enviar correo"),
            "username": openapi.Schema(type=openapi.TYPE_STRING, description="Usuario para enviar correo"),
            "password": openapi.Schema(type=openapi.TYPE_STRING, description="Contraseña para enviar correo")
        },
        required=["email", "name", "username", "password"],
    ),
    responses={
        200: openapi.Response(description="Correo enviado con éxito"),
        500: openapi.Response(description="Error desconocido"),
    },
)
@api_view(['POST'])
@permission_classes([IsClubAdmin])
def bienvenida(request):
    api_key = settings.MAILJET_API_KEY
    api_secret = settings.MAILJET_API_SECRET

    body = json.loads(request.body)

    email = body.get("email")
    name = body.get("name")
    username = body.get("username")
    password = body.get("password")

    mailjet = Client(auth=(api_key, api_secret), version='v3.1')

    data = {
        'Messages': [
            {
                "From": {
                    "Email": settings.MAIL_FROM_EMAIL,
                    "Name": "Sphere Center Pro"
                },
                "To": [
                    {
                        "Email": email,
                        "Name": "Nicolas Catalan"
                    }
                ],
                "TemplateID": 7708301,
                "TemplateLanguage": True,
                "Subject": "Bievenida a SportSpherePro",
                "Variables": {
				  "password": password,
				  "username": username,
				  "firstname": name
				}
            }
        ]
    }

    result = mailjet.send.create(data=data)
    print(result.status_code)
    print(result.json())
    return Response({"message": "Correo enviado con éxito", "mailStatus": result.status_code}, status=status.HTTP_200_OK if result.status_code < 400 else status.HTTP_502_BAD_GATEWAY)

    
@swagger_auto_schema(
    method="post",
    operation_description="Envía un mensaje de contacto al administrador",
    tags=["Envio Mail"],
    request_body=openapi.Schema(
        type=openapi.TYPE_OBJECT,
        required=["email", "name", "message"],
        properties={
            "email": openapi.Schema(type=openapi.TYPE_STRING),
            "name": openapi.Schema(type=openapi.TYPE_STRING),
            "message": openapi.Schema(type=openapi.TYPE_STRING),
        },
    ),
)    
@api_view(["POST"])
@permission_classes([AllowAny])
def contacto(request):
    return _send_contact_message(
        payload=request.data,
        required_fields=["name", "email", "message"],
        template_name="contacto.html",
        subject_name=lambda payload: payload.get("name"),
        text_lines=lambda payload: [
            f"Nombre: {payload.get('name')}",
            f"Correo: {payload.get('email')}",
            *_club_lines(payload),
            "",
            "Mensaje:",
            payload.get("message"),
        ],
        context_builder=lambda payload: {
            "EMPRESA": "Sphere Center Pro",
            "NOMBRE": payload.get("name"),
            "EMAIL": payload.get("email"),
            "MENSAJE": "\n".join([*_club_lines(payload), "", payload.get("message") or ""]).strip(),
        },
        recipient=settings.CONTACT_EMAIL_TO,
    )


def _club_lines(payload):
    """Datos opcionales del formulario de la landing (club, teléfono y tamaño del club)."""
    campos = [("Club", "club"), ("Teléfono", "telefono"), ("N° de deportistas", "deportistas")]
    return [f"{label}: {payload.get(key)}" for label, key in campos if payload.get(key)]


@swagger_auto_schema(
    method="post",
    operation_description="Envía un mensaje de contacto UPAC All Stars",
    tags=["Envio Mail"],
    request_body=openapi.Schema(
        type=openapi.TYPE_OBJECT,
        required=["nombre", "apellidos", "edad", "email", "telefono", "direccion", "mensaje"],
        properties={
            "nombre": openapi.Schema(type=openapi.TYPE_STRING),
            "apellidos": openapi.Schema(type=openapi.TYPE_STRING),
            "edad": openapi.Schema(type=openapi.TYPE_STRING),
            "email": openapi.Schema(type=openapi.TYPE_STRING),
            "telefono": openapi.Schema(type=openapi.TYPE_STRING),
            "direccion": openapi.Schema(type=openapi.TYPE_STRING),
            "mensaje": openapi.Schema(type=openapi.TYPE_STRING),
        },
    ),
)
@api_view(["POST"])
@permission_classes([AllowAny])
def contacto_upac(request):
    return _send_contact_message(
        payload=request.data,
        required_fields=["nombre", "apellidos", "edad", "email", "telefono", "direccion", "mensaje"],
        template_name="contacto_upac.html",
        subject_name=lambda payload: f"{payload.get('nombre')} {payload.get('apellidos')}".strip(),
        text_lines=lambda payload: [
            f"Nombre: {payload.get('nombre')}",
            f"Apellidos: {payload.get('apellidos')}",
            f"Edad: {payload.get('edad')}",
            f"Correo: {payload.get('email')}",
            f"Teléfono: {payload.get('telefono')}",
            f"Dirección: {payload.get('direccion')}",
            "",
            "Mensaje:",
            payload.get("mensaje"),
        ],
        context_builder=lambda payload: {
            "EMPRESA": "UPAC All Stars",
            "NOMBRE": payload.get("nombre"),
            "APELLIDOS": payload.get("apellidos"),
            "EDAD": payload.get("edad"),
            "EMAIL": payload.get("email"),
            "TELEFONO": payload.get("telefono"),
            "DIRECCION": payload.get("direccion"),
            "MENSAJE": payload.get("mensaje"),
        },
        recipient=getattr(settings, "CONTACT_UPAC_EMAIL_TO", None) or settings.CONTACT_EMAIL_TO,
    )