"""Serializers for Telegram authentication endpoints."""

from __future__ import annotations

from rest_framework import serializers


class TelegramAuthRequestSerializer(serializers.Serializer):
    """Incoming payload for Telegram WebApp authentication."""

    init_data = serializers.CharField(help_text="Telegram initData string from the WebApp")
    start_param = serializers.CharField(
        required=False,
        allow_blank=True,
        help_text="Optional referral/start parameter passed from Telegram",
    )


class TelegramAuthenticatedUserSerializer(serializers.Serializer):
    """User details returned after a successful Telegram auth."""

    id = serializers.IntegerField(read_only=True)
    telegram_user_id = serializers.IntegerField(read_only=True)
    username = serializers.CharField(required=False, allow_null=True, allow_blank=True)
    first_name = serializers.CharField()
    last_name = serializers.CharField(required=False, allow_null=True, allow_blank=True)
    language_code = serializers.CharField(required=False, allow_null=True, allow_blank=True)
    photo_url = serializers.URLField(required=False, allow_null=True, allow_blank=True)
    credit_balance = serializers.DecimalField(max_digits=20, decimal_places=8)
    bonus_balance = serializers.DecimalField(max_digits=20, decimal_places=8)
    referral_code = serializers.CharField()
    referred_by = serializers.IntegerField(
        required=False,
        allow_null=True,
        help_text="ID of the referring user, if provided",
    )


class UserWalletSerializer(serializers.Serializer):
    """Entry for a specific wallet balance."""

    name = serializers.CharField()
    type = serializers.CharField()
    balance = serializers.DecimalField(max_digits=20, decimal_places=8)


class TelegramAuthResponseSerializer(serializers.Serializer):
    """Token pair plus user payload after Telegram auth."""

    access = serializers.CharField()
    refresh = serializers.CharField()
    user = TelegramAuthenticatedUserSerializer()


class TelegramWebhookResponseSerializer(serializers.Serializer):
    """Acknowledgement returned to Telegram webhooks."""

    ok = serializers.BooleanField()
    error = serializers.CharField(required=False, allow_null=True, allow_blank=True)
