from rest_framework import serializers
from .models import Users, UserInvitation


class ChangePasswordSerializer(serializers.Serializer):
    old_password = serializers.CharField(required=False)
    new_password = serializers.CharField()
    confirm_password = serializers.CharField()
    token = serializers.CharField(required=False)


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


class EmailAndPasswordSerializer(serializers.Serializer):
    email = serializers.EmailField()
    password = serializers.CharField()


class RegisterSerializer(serializers.Serializer):
    first_name = serializers.CharField(max_length=255)
    last_name = serializers.CharField(max_length=255)
    email = serializers.EmailField()
    mobile_number = serializers.CharField(max_length=255, required=False)
    birthdate = serializers.DateTimeField(required=False)
    company = serializers.CharField(max_length=255, required=False)
    office_address = serializers.CharField(max_length=255, required=False)
    company_website = serializers.CharField(max_length=255, required=False)
    password = serializers.CharField()
    confirm_password = serializers.CharField()
    how_did_you_know = serializers.CharField(max_length=525, required=False)
    touchpoint = serializers.CharField(max_length=525, required=False)
    brand = serializers.CharField(max_length=255, required=False)
    terms_agreement = serializers.BooleanField(default=False)


class UsersSerializerRead(serializers.ModelSerializer):
    class Meta:
        model = Users
        exclude = ["password"]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        is_activity_logs = self.context.get("is_activity_logs", False)

        if is_activity_logs:
            allowed_fields = [
                "id",
                "is_superuser",
                "is_staff",
                "created_at",
                "first_name",
                "last_name",
                "email",
                "role",
            ]
            init_fields = list(self.fields.keys())

            for field in init_fields:
                if field not in allowed_fields:
                    self.fields.pop(field)


class UsersSerializerWrite(serializers.ModelSerializer):
    class Meta:
        model = Users
        exclude = ["is_superuser"]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        user = self.context["user"]
        is_not_admin = user is None or not (user.is_staff and user.is_superuser)

        if is_not_admin:
            self.fields.pop("is_approved", None)
            self.fields.pop("is_staff", None)
            self.fields.pop("is_active", None)
            self.fields.pop("password", None)


class UserInvitationSerializer(serializers.ModelSerializer):
    invitee = UsersSerializerRead(many=False)

    class Meta:
        model = UserInvitation
        fields = "__all__"


class UserInvitationCustomSerializer(serializers.Serializer):
    first_name = serializers.CharField(max_length=255)
    last_name = serializers.CharField(max_length=255)
    email = serializers.EmailField()
    role = serializers.CharField(max_length=255)


class UserStaffRegisterSerializer(serializers.Serializer):
    email = serializers.EmailField()
    password = serializers.CharField(max_length=20)
    confirm_password = serializers.CharField(max_length=20)


class ApproveUsersSerializer(serializers.Serializer):
    id = serializers.CharField(max_length=1000)
    status = serializers.CharField(max_length=255)


# Serializers for Swagger Documentations Only but still can be used if needed.
class LoginSerializerRead(serializers.Serializer):
    message = serializers.CharField()
    refresh_token = serializers.CharField()
    access_token = serializers.CharField()
    user = UsersSerializerRead(many=False)
