from rest_framework import serializers
from .models import AdminTable
from rest_framework_simplejwt.tokens import RefreshToken
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from utils.helper import  failed_response
from rest_framework import status

class AdminRegistrationSerializer(serializers.ModelSerializer):
    class Meta:
        model = AdminTable
        fields =['first_name','last_name','username','email','password', 'is_super_admin']
        extra_kwargs ={
            'password' :{'write_only':True}
        }
           
    def create(self,validated_data):
        is_super_admin = validated_data.pop('is_super_admin', False)
        if is_super_admin:
            user = AdminTable.objects.create_superuser(**validated_data)
        else:
            user = AdminTable.objects.create_user(**validated_data)
        return user


class AdminToken(RefreshToken):
    @property
    def user(self):
        return self.get("user_id")

    @classmethod
    def for_user(cls, user):
        token = cls()
        if not user.id or not user.email or not user.username:
            raise failed_response(msg="User must have an ID, email, and username", code=status.HTTP_404_NOT_FOUND)
        token['user_id'] = user.id
        token['email'] = user.email
        token['username'] = user.username
        return token

class AdminTokenObtainPairSerializer(TokenObtainPairSerializer):
    username = serializers.CharField(required=True)
    email = serializers.EmailField(required=True)
    password = serializers.CharField(required=True, write_only=True)

    @classmethod
    def get_token(cls, admin):
        token = AdminToken.for_user(admin)
        token['username'] = admin.username
        token['email'] = admin.email
        return token
    
    def validate(self, attrs):
        username = attrs.get('username')
        password = attrs.get('password')
        email = attrs.get('email')

        if not username or not password or not email:
            raise failed_response(msg="All username, password and email fields are required")
        try:
            admin = AdminTable.objects.get(username=username, email=email)
        except AdminTable.DoesNotExist:
            raise failed_response(msg="Invalid username or password")
        if not admin.check_password(password):
            raise failed_response(msg="Invalid password")
        try:
            token = self.get_token(admin)
            return {
                'refresh': str(token),
                'access': str(token.access_token),
            }
        except Exception as e:
            raise failed_response(msg="Failed to generate token")
       