"""Comprehensive schema validation tests."""
from datetime import datetime
from app.schemas import *


def test_user_schemas():
    """Test user-related schemas."""
    print("Testing User Schemas...")
    
    # Test UserCreate
    user = UserCreate(
        username="testuser",
        password="securepass123",
        email="test@example.com",
        country="US"
    )
    assert user.username == "testuser"
    assert user.password == "securepass123"
    print("  ✅ UserCreate validates")
    
    # Test UserResponse
    user_resp = UserResponse(
        id=1,
        username="testuser",
        email="test@example.com",
        country="US",
        real_name="Test User",
        privlevel="User",
        vip_status=0,
        is_active=True,
        is_banned=False,
        ban_reason=None,
        creation_date=datetime.now(),
        last_login=None
    )
    assert user_resp.id == 1
    print("  ✅ UserResponse validates")
    
    # Test UserUpdate
    update = UserUpdate(
        email="new@example.com",
        country="UK",
        real_name="Updated Name",
        new_password="newsecurepass"
    )
    assert update.email == "new@example.com"
    print("  ✅ UserUpdate validates")


def test_deck_schemas():
    """Test deck-related schemas."""
    print("Testing Deck Schemas...")
    
    # Test DeckCreate
    deck = DeckCreate(
        name="Test Deck",
        content="4 Lightning Bolt\n4 Shock",
        format="native",
        status="DRAUGHT"
    )
    assert deck.name == "Test Deck"
    print("  ✅ DeckCreate validates")
    
    # Test UserDeckResponse
    deck_resp = UserDeckResponse(
        id=1,
        user_id=1,
        name="Test Deck",
        status="DRAFT",
        folder_id=None,
        format="standard",
        notes=None,
        is_precedent=False,
        precedent_name=None,
        created_at=datetime.now(),
        updated_at=datetime.now(),
        card_count=0,
        is_owner=True
    )
    assert deck_resp.id == 1
    print("  ✅ UserDeckResponse validates")
    
    # Test DeckCardResponse
    card = DeckCardResponse(
        id=1,
        deck_id=1,
        card_id=100,
        quantity=4,
        zone="main",
        position=None
    )
    assert card.quantity == 4
    assert card.zone == "main"
    print("  ✅ DeckCardResponse validates")


def test_card_schemas():
    """Test card-related schemas."""
    print("Testing Card Schemas...")
    
    # Test CardCollectionCreate
    card = CardCollectionCreate(
        card_id=1,
        quantity=4,
        condition="NEAR_MINT",
        language="EN",
        is_foil=False
    )
    assert card.quantity == 4
    print("  ✅ CardCollectionCreate validates")
    
    # Test MtgCardResponse
    mtg_card = MtgCardResponse(
        id=1,
        name="Lightning Bolt",
        mana_cost="{R}",
        type_line="Instant",
        oracle_text="Lightning Bolt deals 3 damage to any target.",
        power=None,
        toughness=None,
        rarity="Common",
        layout="normal",
        artist="Dan Frazier",
        created_at=datetime.now()
    )
    assert mtg_card.name == "Lightning Bolt"
    print("  ✅ MtgCardResponse validates")
    
    # Test CardImportBatchCreate
    batch = CardImportBatchCreate(
        user_id=1,
        card_names=["Lightning Bolt", "Shock", "Thoughtseize"],
        source="manual"
    )
    assert len(batch.card_names) == 3
    print("  ✅ CardImportBatchCreate validates")


def test_proto_schemas():
    """Test protocol schemas."""
    print("Testing Protocol Schemas...")
    
    # Test SessionCommand
    cmd = SessionCommand(
        message_type="SessionCommand",
        cmd_type=1001,
        cmd_id=1,
        data={"username": "test"}
    )
    assert cmd.cmd_type == 1001
    print("  ✅ SessionCommand validates")
    
    # Test GameEvent
    event = GameEvent(
        message_type="GameEvent",
        event_type=1000,
        player_id=1,
        data={"game_id": 123}
    )
    assert event.event_type == 1000
    print("  ✅ GameEvent validates")


def test_group_schemas():
    """Test group-related schemas."""
    print("Testing Group Schemas...")
    
    # Test GroupCreate
    group = GroupCreate(
        name="Test Group",
        description="A test group",
        is_public=True,
        max_members=50
    )
    assert group.name == "Test Group"
    print("  ✅ GroupCreate validates")
    
    # Test GroupResponse
    group_resp = GroupResponse(
        id=1,
        name="Test Group",
        description="A test group",
        owner_id=1,
        is_public=True,
        max_members=50,
        created_at=datetime.now(),
        updated_at=datetime.now(),
        member_count=5,
        is_member=True
    )
    assert group_resp.id == 1
    print("  ✅ GroupResponse validates")


def test_network_schemas():
    """Test network-related schemas."""
    print("Testing Network Schemas...")
    
    # Test NetworkCreate
    network = NetworkCreate(
        name="Test Network",
        description="A test network",
        is_public=True
    )
    assert network.name == "Test Network"
    print("  ✅ NetworkCreate validates")
    
    # Test NetworkResponse
    network_resp = NetworkResponse(
        id=1,
        name="Test Network",
        description="A test network",
        creator_id=1,
        is_public=True,
        created_at=datetime.now(),
        member_count=10,
        is_member=False
    )
    assert network_resp.id == 1
    print("  ✅ NetworkResponse validates")


def test_validation_errors():
    """Test validation error handling."""
    print("Testing Validation Errors...")
    
    # Test invalid username (too short)
    try:
        UserCreate(username="ab", password="securepass123")
        assert False, "Should have raised validation error"
    except Exception as e:
        assert "min_length" in str(e)
        print("  ✅ Username length validation works")
    
    # Test invalid password (too short)
    try:
        UserCreate(username="testuser", password="123")
        assert False, "Should have raised validation error"
    except Exception as e:
        assert "min_length" in str(e)
        print("  ✅ Password length validation works")
    
    # Test invalid country code
    try:
        UserCreate(username="testuser", password="securepass123", country="USA")
        assert False, "Should have raised validation error"
    except Exception as e:
        assert "max_length" in str(e)
        print("  ✅ Country code length validation works")


def test_enum_schemas():
    """Test enum-based schemas."""
    print("Testing Enum Schemas...")
    
    # Test DeckStatus
    assert DeckStatus.DRAFT.value == "DRAFT"
    assert DeckStatus.FINAL.value == "FINAL"
    print("  ✅ DeckStatus enum validates")
    
    # Test DeckZone
    assert DeckZone.MAIN.value == "main"
    assert DeckZone.SIDEBOARD.value == "sideboard"
    print("  ✅ DeckZone enum validates")
    
    # Test CardCondition
    assert CardCondition.NEAR_MINT.value == "NEAR_MINT"
    assert CardCondition.HEAVILY_PLAYED.value == "HEAVILY_PLAYED"
    print("  ✅ CardCondition enum validates")


def test_generic_schemas():
    """Test generic response schemas."""
    print("Testing Generic Schemas...")
    
    # Test MessageResponse
    msg = MessageResponse(message="Success")
    assert msg.message == "Success"
    print("  ✅ MessageResponse validates")
    
    # Test CountResponse
    count = CountResponse(count=42)
    assert count.count == 42
    print("  ✅ CountResponse validates")
    
    # Test ErrorResponse
    error = ErrorResponse(detail="Something went wrong")
    assert error.detail == "Something went wrong"
    print("  ✅ ErrorResponse validates")


def main():
    print("Schema Validation Tests")
    print("=" * 60)
    
    try:
        test_user_schemas()
        test_deck_schemas()
        test_card_schemas()
        test_proto_schemas()
        test_group_schemas()
        test_network_schemas()
        test_validation_errors()
        test_enum_schemas()
        test_generic_schemas()
        
        print("\n" + "=" * 60)
        print("✅ All schema validation tests passed!")
        return 0
    except Exception as e:
        print(f"\n❌ Test failed: {e}")
        import traceback
        traceback.print_exc()
        return 1


if __name__ == "__main__":
    import sys
    sys.exit(main())
