"""Tests for configuration API endpoints.

Tests the config endpoints that provide default game configurations.
These endpoints are public (no auth required) and return static defaults.
"""

import pytest
from fastapi import FastAPI
from fastapi.testclient import TestClient

from app.api.config import router as config_router
from app.core.config import DeckConfig


@pytest.fixture
def app():
    """Create a test FastAPI app with config router."""
    test_app = FastAPI()
    test_app.include_router(config_router, prefix="/api")
    return test_app


@pytest.fixture
def client(app):
    """Create a test client."""
    return TestClient(app)


class TestGetDefaultDeckConfig:
    """Tests for GET /api/config/deck endpoint."""

    def test_returns_default_deck_config(self, client):
        """
        Test that the endpoint returns the default DeckConfig values.

        The frontend uses these values for UI display (progress bars, limits)
        before the user has selected a game mode or custom rules.
        """
        response = client.get("/api/config/deck")

        assert response.status_code == 200
        data = response.json()

        # Verify it matches DeckConfig defaults
        expected = DeckConfig()
        assert data["min_size"] == expected.min_size
        assert data["max_size"] == expected.max_size
        assert data["max_copies_per_card"] == expected.max_copies_per_card
        assert data["energy_deck_size"] == expected.energy_deck_size
        assert data["min_basic_pokemon"] == expected.min_basic_pokemon

    def test_returns_all_deck_config_fields(self, client):
        """
        Test that all DeckConfig fields are included in the response.

        Frontend may need any of these fields for UI or validation requests,
        so the endpoint should return the complete configuration.
        """
        response = client.get("/api/config/deck")

        assert response.status_code == 200
        data = response.json()

        # All DeckConfig fields should be present
        expected_fields = [
            "min_size",
            "max_size",
            "exact_size_required",
            "max_copies_per_card",
            "max_copies_basic_energy",
            "min_basic_pokemon",
            "energy_deck_enabled",
            "energy_deck_size",
            "starting_hand_size",
        ]
        for field in expected_fields:
            assert field in data, f"Missing field: {field}"

    def test_default_values_match_mantimon_rules(self, client):
        """
        Test that defaults match Mantimon TCG house rules.

        Mantimon uses a 40-card main deck with 20-card energy deck,
        4-copy limit, and requires at least 1 Basic Pokemon.
        """
        response = client.get("/api/config/deck")

        assert response.status_code == 200
        data = response.json()

        # Mantimon TCG defaults (not standard Pokemon TCG)
        assert data["min_size"] == 40, "Main deck should be 40 cards"
        assert data["max_size"] == 40, "Main deck should be exactly 40"
        assert data["energy_deck_size"] == 20, "Energy deck should be 20 cards"
        assert data["max_copies_per_card"] == 4, "4-copy limit per card"
        assert data["min_basic_pokemon"] == 1, "At least 1 Basic Pokemon"
        assert data["energy_deck_enabled"] is True, "Separate energy deck enabled"

    def test_no_authentication_required(self, client):
        """
        Test that the endpoint is accessible without authentication.

        Config endpoints provide public defaults that the frontend needs
        before the user has logged in or selected a game mode.
        """
        # No auth headers provided
        response = client.get("/api/config/deck")

        # Should succeed without auth
        assert response.status_code == 200
