from rest_framework import serializers
from django.contrib.auth import authenticate
from users.models import User, ProfileLink


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['id', 'first_name', 'last_name', 'username', 'email', 'bio', 'avatar', 'banner', 'banner_position_y', 'banner_zoom', 'banner_brightness', 'banner_contrast', 'is_private', 'is_active', 'is_verified', 'created_at', 'updated_at']
        read_only_fields = ['id', 'is_verified', 'created_at', 'updated_at']

    def to_representation(self, instance):
        data = super().to_representation(instance)

        # Handle missing avatar for active users
        if not data.get('avatar'):
            data['avatar'] = "/default_user_avatar.png"

        # Add profile links
        request = self.context.get('request')
        if request and request.user == instance:
            links = instance.profile_links.all().order_by('order', 'created_at')
        else:
            links = instance.profile_links.filter(is_enabled=True).order_by('order', 'created_at')

        data['profile_links'] = ProfileLinkSerializer(links, many=True).data

        return data


class UserRegistrationSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True)
    password_confirm = serializers.CharField(write_only=True)

    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'username', 'email', 'password', 'password_confirm']

    def validate(self, attrs):
        if attrs['password'] != attrs['password_confirm']:
            raise serializers.ValidationError("Passwords do not match.")
        return attrs

    def create(self, validated_data):
        validated_data.pop('password_confirm')
        user = User.objects.create_user(**validated_data)
        return user


class UserLoginSerializer(serializers.Serializer):
    identifier = serializers.CharField()
    password = serializers.CharField()

    def validate(self, attrs):
        identifier = attrs.get('identifier')
        password = attrs.get('password')

        if identifier and password:
            # Check if identifier is an email
            if '@' in identifier:
                try:
                    user_obj = User.objects.get(email__iexact=identifier)
                    username = user_obj.username
                except User.DoesNotExist:
                    # If email not found, we still pass it to authenticate to get the standard failure
                    username = identifier
            else:
                try:
                    user_obj = User.objects.get(username__iexact=identifier)
                    username = user_obj.username
                except User.DoesNotExist:
                    username = identifier

            user = authenticate(username=username, password=password)
            if not user:
                raise serializers.ValidationError("Invalid credentials.")
            attrs['user'] = user
            return attrs
        else:
            raise serializers.ValidationError("Must include 'identifier' and 'password'.")


class ProfileLinkSerializer(serializers.ModelSerializer):
    """Serializer for user profile links (social media and custom links)"""


    class Meta:
        model = ProfileLink
        fields = ['id', 'link_type', 'url', 'display_name', 'is_enabled', 'order', 'created_at', 'updated_at']
        read_only_fields = ['id', 'created_at', 'updated_at']

    def validate(self, attrs):
        # Ensure display_name is provided for custom links
        if attrs.get('link_type') == 'custom' and not attrs.get('display_name'):
            raise serializers.ValidationError("Display name is required for custom links")
        return attrs