from typing import Any, Optional
from rest_framework import serializers
from django.conf import settings
from api.types import User

class UserResponseSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    email = serializers.EmailField(read_only=True)
    account_type = serializers.CharField(
        source='userprofile.account_type',
        read_only=True
    )
    name = serializers.CharField(source='first_name', read_only=True)
    surname = serializers.CharField(source='last_name', read_only=True)
    imageURL = serializers.SerializerMethodField()
    uuid = serializers.SerializerMethodField()

    class Meta:
        ref_name = "UserResponse"  # для OpenAPI

    def get_uuid(self, obj: User) -> Optional[str]:
        """Получает короткий UUID (первые 6 символов) из профиля пользователя"""
        return obj.userprofile.short_uuid if hasattr(obj, 'userprofile') else None

    def get_imageURL(self, obj: User) -> Optional[str]:
        """Получает полный URL для изображения профиля пользователя"""
        try:
            if not hasattr(obj, 'userprofile') or not obj.userprofile.imageURL:
                return None
                
            relative_url = obj.userprofile.imageURL.lstrip('/')
            base_url = settings.BASE_URL.rstrip('/')
            return f"{base_url}/{relative_url}"
        except Exception:
            return None
            
    def to_representation(self, instance: User) -> dict[str, Any]:
        """Переопределяется для добавления проверки типа для вывода"""
        data = super().to_representation(instance)
        return {
            'id': data['id'],  # int
            'email': data['email'],  # str
            'account_type': data['account_type'],  # AccountTypeLiteral
            'name': data['name'],  # str
            'surname': data['surname'],  # str
            'imageURL': data['imageURL'],  # Optional[str]
            'uuid': data['uuid'],  # Optional[str]
        }


class LoginRequestSerializer(serializers.Serializer):
    """Сериализатор для запроса авторизации"""
    login = serializers.CharField(
        help_text="Логин пользователя",
        required=True
    )
    password = serializers.CharField(
        help_text="Пароль пользователя",
        write_only=True,
        required=True,
        style={'input_type': 'password'}
    )


class LoginResponseSerializer(serializers.Serializer):
    """Сериализатор для ответа при успешной авторизации"""
    message = serializers.CharField(
        help_text="Сообщение о успешной авторизации",
        read_only=True
    )
    access = serializers.CharField(
        help_text="JWT access token для авторизации запросов",
        read_only=True
    )
    refresh = serializers.CharField(
        help_text="JWT refresh token для обновления access token",
        read_only=True
    )
    user = UserResponseSerializer(
        help_text="Данные авторизованного пользователя",
        read_only=True
    )


class LogoutResponseSerializer(serializers.Serializer):
    """Сериализатор для ответа при выходе из системы"""
    message = serializers.CharField(
        help_text="Сообщение о успешном выходе",
        read_only=True
    )


class RefreshTokenRequestSerializer(serializers.Serializer):
    """Сериализатор для запроса обновления токена"""
    refresh = serializers.CharField(
        help_text="Refresh token для обновления",
        required=True
    )


class RefreshTokenResponseSerializer(serializers.Serializer):
    """Сериализатор для ответа с обновленными токенами"""
    access = serializers.CharField(
        help_text="Новый JWT access token",
        read_only=True
    )
    refresh = serializers.CharField(
        help_text="Новый JWT refresh token",
        read_only=True
    )
    expires_at = serializers.FloatField(
        help_text="Timestamp времени истечения access token",
        read_only=True
    )