from rest_framework import serializers
from api.property_api.agent.models.agent import Agent
from django.contrib.auth import get_user_model
from api.property_api.property.models.property import Property
from api.property_api.property.serializers.property_serializer import PropertySerializer

from django.core.mail import send_mail
from django.conf import settings
from django.template.loader import render_to_string

User = get_user_model()


class AgentDetailSerializer(serializers.Serializer):
    """Serializer for agent details in property response"""
    id = serializers.IntegerField()
    name = serializers.CharField()
    email = serializers.EmailField()
    contact_no = serializers.CharField()
    profile_picture = serializers.ImageField()
    cover_picture = serializers.ImageField()
    company_name = serializers.CharField()
    bio = serializers.CharField()
    designation = serializers.CharField()
    linkedin = serializers.CharField()
    facebook = serializers.CharField()
    youtube = serializers.CharField()
    whatsapp = serializers.CharField()
    verified = serializers.BooleanField()


class PropertyWithAgentSerializer(serializers.ModelSerializer):
    id = serializers.ReadOnlyField()
    agent = AgentDetailSerializer(read_only=True)
    
    class Meta:
        model = Property
        fields = '__all__'

class AgentSerializer(serializers.ModelSerializer):
    id = serializers.ReadOnlyField()
    password = serializers.CharField(write_only=True)
    confirm_password = serializers.CharField(write_only=True)
    active_listings = PropertySerializer(source="agents",many=True,read_only=True)

    class Meta:
        model = Agent
        fields = [
            'id', 'name', 'email','agent_user',
            'contact_no','profile_picture','cover_picture','company_name','bio','specialty_and_services','area_of_operation','password','confirm_password','active_listings','created_at','country','created_by','created_at','designation',
            'linkedin','facebook','youtube','whatsapp','username','has_username'
        ]
        read_only_fields = ['id','created_at']

    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(
                "A user with this email already exists"
            )
        return value

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

        email = validated_data.get('email')
        name = validated_data.get('name')
        specialties  = validated_data.pop('specialty_and_services', [])
        areas  = validated_data.pop('area_of_operation', [])

        # 1️⃣ Create User
        user = User.objects.create(
            email=email,
            full_name = name
        )
        user.role = 'agent'
        user.is_active = True
        user.set_password(password)
        user.save()

        # 2️⃣ Create Agent linked to user
        agent = Agent.objects.create(
            created_by=self.context['request'].user,
            agent_user=user,
            **validated_data
        )

        agent.specialty_and_services.set(specialties)
        agent.area_of_operation.set(areas)

        # send mail with password
        subject = "Your Agent Account Credentials"

        text_message = f"""
        Hello {name},

        Your agent account has been created successfully.

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

        Please keep this information secure.

        — discovercafe Team
        """

        # html_message = render_to_string(
        #     "emails/agent_credentials.html",
        #     {
        #         "name": name,
        #         "email": email,
        #         "password": password
        #     }
        # )

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


        return agent