"""User + JWT serializers."""

from djoser.serializers import UserSerializer as BaseUserSerializer
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer

from apps.users.models import User


class UserSerializer(BaseUserSerializer):
    """Serializer used by Djoser for GET/PATCH /auth/users/me/."""

    class Meta(BaseUserSerializer.Meta):
        model = User
        fields = (
            "id",
            "email",
            "full_name",
            "phone_number",
            "avatar",
            "language",
            "role",
            "notifications_enabled",
            "is_active",
            "date_joined",
            "created_at",
            "updated_at",
        )
        read_only_fields = ("id", "email", "role", "date_joined", "created_at", "updated_at")


class FlatTokenObtainPairSerializer(TokenObtainPairSerializer):
    """Login serializer that returns the user fields alongside the JWT pair.

    The renderer (`apps.core.renderers.StandardResponseRenderer`) then promotes
    `access` / `refresh` to the public `access_token` / `refresh_token` shape
    and adds `token_type` / `expires_at` / `refresh_expires_at`.
    """

    def validate(self, attrs):
        # Validates credentials and returns {"refresh": ..., "access": ...}.
        token_data = super().validate(attrs)

        user_data = UserSerializer(self.user, context=self.context).data
        # Order matters: user fields first, then tokens, so the response
        # reads naturally top-to-bottom.
        return {**user_data, **token_data, "_message": "msg.loginSuccess"}
