from rest_framework import serializers
from django.contrib.auth.password_validation import validate_password

from apps.accounts.models import LoginSession, Role, User


class UserSerializer(serializers.ModelSerializer):
    full_name = serializers.CharField(read_only=True)

    class Meta:
        model = User
        fields = (
            "id",
            "email",
            "first_name",
            "last_name",
            "full_name",
            "phone",
            "role",
            "is_active",
            "is_email_verified",
            "is_phone_verified",
            "two_factor_enabled",
            "last_login",
            "date_joined",
        )
        read_only_fields = fields


class PasswordChangeSerializer(serializers.Serializer):
    current_password = serializers.CharField(write_only=True)
    new_password = serializers.CharField(write_only=True)

    def validate_new_password(self, value):
        validate_password(value, self.context["request"].user)
        return value


class PasswordResetRequestSerializer(serializers.Serializer):
    email = serializers.EmailField()


class PasswordResetConfirmSerializer(serializers.Serializer):
    email = serializers.EmailField()
    code = serializers.CharField(max_length=10)
    new_password = serializers.CharField(write_only=True)

    def validate_new_password(self, value):
        validate_password(value)
        return value


class LoginSerializer(serializers.Serializer):
    email = serializers.EmailField()
    password = serializers.CharField(write_only=True)
    otp_code = serializers.CharField(required=False, allow_blank=True)
    totp_code = serializers.CharField(required=False, allow_blank=True)
    portal = serializers.ChoiceField(choices=["investor", "admin"], required=False)


class OTPRequestSerializer(serializers.Serializer):
    email = serializers.EmailField(required=False)
    purpose = serializers.CharField()


class OTPVerifySerializer(serializers.Serializer):
    code = serializers.CharField(max_length=10)
    purpose = serializers.CharField()


class SessionSerializer(serializers.ModelSerializer):
    class Meta:
        model = LoginSession
        fields = (
            "id",
            "ip_address",
            "user_agent",
            "device_label",
            "is_active",
            "last_seen_at",
            "created_at",
        )


class RoleChoiceSerializer(serializers.Serializer):
    value = serializers.CharField()
    label = serializers.CharField()

    @staticmethod
    def all_roles():
        return [{"value": value, "label": label} for value, label in Role.choices]
