from rest_framework import serializers
from django.contrib.auth.password_validation import validate_password
from .models import User, UserSession, SessionConfiguration


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ("id", "username", "email", "role", "phone", "is_superuser", "is_staff")


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

    class Meta:
        model = User
        fields = ("username", "email", "password", "role", "phone")

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

    def create(self, validated_data):
        user = User.objects.create_user(
            username=validated_data["username"],
            email=validated_data.get("email"),
            password=validated_data["password"],
            role=validated_data.get("role", "CUSTOMER"),
            phone=validated_data.get("phone"),
        )
        return user

class DeliveryPartnerProfileSerializer(serializers.ModelSerializer):
    class Meta:
        from .models import DeliveryPartnerProfile
        model = DeliveryPartnerProfile
        fields = ("vehicle_type", "vehicle_number", "driving_license", "is_verified")


class UserSessionSerializer(serializers.ModelSerializer):
    username = serializers.CharField(source='user.username', read_only=True)
    user_email = serializers.CharField(source='user.email', read_only=True)
    user_role = serializers.CharField(source='user.role', read_only=True)
    is_current = serializers.SerializerMethodField()

    class Meta:
        model = UserSession
        fields = (
            "id",
            "session_key",
            "username",
            "user_email",
            "user_role",
            "ip_address",
            "user_agent",
            "created_at",
            "last_activity",
            "is_active",
            "is_current"
        )
        read_only_fields = fields

    def get_is_current(self, obj):
        request = self.context.get('request')
        if not request or not request.auth:
            return False
        token = request.auth
        try:
            token_session_key = token.get("session_key")
            return token_session_key == str(obj.session_key)
        except Exception:
            return False


class SessionConfigurationSerializer(serializers.ModelSerializer):
    class Meta:
        model = SessionConfiguration
        fields = ("absolute_expiry_hours", "inactivity_timeout_minutes", "max_sessions_per_user")
