"""Tests for the /me/ and /me/wallets/ profile endpoints."""

from __future__ import annotations

from decimal import Decimal

from django.test import TestCase
from django.urls import reverse
from rest_framework import status
from rest_framework.test import APIClient

from apps.users.models import User


class MeViewSetTests(TestCase):
    def setUp(self):
        self.client = APIClient()
        self.user = User.objects.create_user(
            telegram_user_id=12345,
            username="alice",
            first_name="Alice",
            credit_balance=Decimal("100.50000000"),
            bonus_balance=Decimal("10.25000000"),
        )
        self.client.force_authenticate(user=self.user)

    def test_get_me_profile(self):
        """GET /api/users/me/ returns the authenticated user's profile."""
        url = reverse("me-list")
        response = self.client.get(url)

        self.assertEqual(response.status_code, status.HTTP_200_OK)
        data = response.json()
        self.assertEqual(data["username"], "alice")
        self.assertEqual(data["first_name"], "Alice")
        self.assertEqual(Decimal(data["credit_balance"]), Decimal("100.50000000"))
        self.assertEqual(Decimal(data["bonus_balance"]), Decimal("10.25000000"))

    def test_get_me_wallets(self):
        """GET /api/users/me/wallets/ returns all wallet balances."""
        url = reverse("me-wallets")
        response = self.client.get(url)

        self.assertEqual(response.status_code, status.HTTP_200_OK)
        data = response.json()
        self.assertEqual(len(data), 2)

        # Check Primary wallet
        primary = next(w for w in data if w["type"] == "credit_balance")
        self.assertEqual(primary["name"], "Primary")
        self.assertEqual(Decimal(primary["balance"]), Decimal("100.50000000"))

        # Check Bonus wallet
        bonus = next(w for w in data if w["type"] == "bonus")
        self.assertEqual(bonus["name"], "Bonus")
        self.assertEqual(Decimal(bonus["balance"]), Decimal("10.25000000"))

    def test_get_me_unauthenticated(self):
        """Requests without auth should be rejected."""
        self.client.force_authenticate(user=None)
        url = reverse("me-list")
        response = self.client.get(url)
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
