from djoser.serializers import UserCreateSerializer as BaseUserCreateSerializer
from rest_framework import serializers
from .models import CustomUser

from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.tokens import RefreshToken
from django.conf import settings

class UserCreateSerializer(BaseUserCreateSerializer):
    # Serializer สำหรับการลงทะเบียน (Djoser จะใช้ตัวนี้)
    class Meta(BaseUserCreateSerializer.Meta):
        model = CustomUser
        fields = ('id', 'username', 'email', 'phone_number', 'password') # เพิ่ม phone_number

class UserSerializer(serializers.ModelSerializer):
    # Serializer สำหรับการดึงข้อมูล (ใช้แสดงข้อมูลผู้ใช้ปัจจุบัน)
    class Meta:
        model = CustomUser
        fields = (
            'id', 'username', 'email', 'phone_number', 'first_name', 'last_name',
            # เพิ่มฟิลด์สถานะสิทธิ์/Role สำหรับ RBAC
            'is_active', 'is_staff', 'is_superuser',
            # เพิ่ม 'role' ใน model
            'role',
        )
        # ตั้งค่า is_active, is_staff, is_superuser เป็น read_only
        read_only_fields = ('id', 'username', 'is_active', 'is_staff', 'is_superuser', 'role')

# Serializer สำหรับ Login JWT ที่รับค่า remember_me
class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):

    def validate(self, attrs):
        # print("CustomTokenObtainPairSerializer called")
        data = super().validate(attrs)

        # รับ remember_me จาก request (รองรับ true/false ทั้ง bool และ string)
        remember_raw = self.context['request'].data.get('remember_me', False)

        remember_me = (
                remember_raw is True or
                str(remember_raw).lower() == "true" or
                remember_raw == "1"
        )

        refresh = self.get_token(self.user)

        # ฝัง remember_me ลงใน payload
        refresh['remember_me'] = remember_me

        # ถ้า remember_me=True → อายุ Refresh Token เป็น 30 วัน
        if remember_me:
            refresh.set_exp(
                from_time=refresh.current_time,
                lifetime=settings.SIMPLE_JWT['REFRESH_TOKEN_LIFETIME_REMEMBER_ME']
            )

        data['refresh'] = str(refresh)
        data['access'] = str(refresh.access_token)
        return data
