from rest_framework import serializers
from django.contrib.auth import get_user_model

from django.core.mail import send_mail
from django.conf import settings

from notification.models import Notification

User = get_user_model()

class CountryAdminRegistrationSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True)
    confirm_password = serializers.CharField(write_only=True)

    class Meta:
        model = User
        fields = [
            "email",
            "full_name",
            "password",
            "confirm_password",
            "country",
        ]

    def validate(self, attrs):
        if attrs["password"] != attrs["confirm_password"]:
            raise serializers.ValidationError(
                {"password": "Password and confirm password do not match"}
            )
        return attrs

    def validate_email(self, value):
        if User.objects.filter(email=value).exists():
            raise serializers.ValidationError("Email already exists")
        return value

    def create(self, validated_data):
        validated_data.pop("confirm_password")
        password = validated_data.pop("password")

        email = validated_data["email"]
        full_name = validated_data.get("full_name")
        country = validated_data.get("country")

        user = User.objects.create(
            email=validated_data["email"],
            full_name=validated_data.get("full_name"),
            country=validated_data.get("country"),
            role="sub_admin",
            is_active=True,
            email_verified=False,
            is_staff=True,
        )

        user.set_password(password)
        user.save()

        # Send credentials email
        country_name = country.name if country else "N/A"

        subject = "Your discovercafe Country Admin Credentials"

        text_message = f"""
        Hello {full_name or email},

        Your Country Admin account has been created successfully.

        Login Credentials:
        Email: {email}
        Password: {password}
        Country: {country_name}

        Please keep this information secure.

        — discovercafe Team
        """

        send_mail(
            subject=subject,
            message=text_message,
            from_email=settings.DEFAULT_FROM_EMAIL,
            recipient_list=[email],
            fail_silently=False
        )

        Notification.objects.create(
            notification_type="country_admin",
            title="New Country Admin Created",
            message=f"{full_name} ({email}) assigned to {country_name}"
        )

        return user