#!/usr/bin/env python3
"""
Test script for daily rewards system.
Verifies that the daily login reward system works correctly.
"""

import sys
import logging
from datetime import date

# Setup logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# Import daily rewards functions
from retention.daily_rewards import (
    initialize_daily_rewards,
    check_daily_login,
    claim_daily_reward,
    get_daily_reward,
    get_login_streak_info,
    get_all_rewards
)


def test_get_all_rewards():
    """Test fetching all reward definitions"""
    print("\n=== Testing get_all_rewards() ===")
    rewards = get_all_rewards()
    print(f"Found {len(rewards)} reward definitions:")
    for reward in rewards:
        print(f"  Day {reward['day_number']}: {reward['display_name']} "
              f"({reward['reward_type']}, {reward['reward_amount']})")
    return len(rewards) == 7


def test_get_daily_reward():
    """Test fetching individual reward"""
    print("\n=== Testing get_daily_reward() ===")
    reward = get_daily_reward(1)
    if reward:
        print(f"Day 1 reward: {reward['name']}")
        print(f"  Type: {reward['type']}, Amount: {reward['amount']}")
        return True
    else:
        print("ERROR: Could not fetch reward for day 1")
        return False


def test_check_daily_login(player_id=1):
    """Test checking daily login for a player"""
    print(f"\n=== Testing check_daily_login(player_id={player_id}) ===")
    result = check_daily_login(player_id)
    print(f"Reward available: {result['reward_available']}")
    print(f"Current streak: {result['streak']}")
    if result['reward']:
        print(f"Today's reward: {result['reward']['name']}")
    print(f"Streak broken: {result.get('streak_broken', False)}")
    return True


def test_get_login_streak_info(player_id=1):
    """Test fetching login streak info"""
    print(f"\n=== Testing get_login_streak_info(player_id={player_id}) ===")
    info = get_login_streak_info(player_id)
    print(f"Current streak: {info['current_streak']}")
    print(f"Total logins: {info['total_logins']}")
    print(f"Next reward day: {info['next_reward_day']}")
    print(f"Last login: {info['last_login_date']}")
    return True


def test_claim_daily_reward(player_id=1):
    """Test claiming daily reward"""
    print(f"\n=== Testing claim_daily_reward(player_id={player_id}) ===")
    result = claim_daily_reward(player_id)
    print(f"Success: {result['success']}")
    print(f"Message: {result['message']}")
    if result['reward']:
        print(f"Claimed reward: {result['reward']['name']}")
    return result['success']


def run_tests():
    """Run all tests"""
    print("=" * 60)
    print("Daily Rewards System Test Suite")
    print("=" * 60)

    tests = [
        ("Get all rewards", test_get_all_rewards),
        ("Get single reward", test_get_daily_reward),
        ("Check daily login", lambda: test_check_daily_login(1)),
        ("Get login streak info", lambda: test_get_login_streak_info(1)),
        # Note: Uncommenting this will actually claim a reward for player 1
        # ("Claim daily reward", lambda: test_claim_daily_reward(1)),
    ]

    results = []
    for test_name, test_func in tests:
        try:
            success = test_func()
            results.append((test_name, success))
            print(f"✓ {test_name}: {'PASS' if success else 'FAIL'}")
        except Exception as e:
            print(f"✗ {test_name}: ERROR - {e}")
            results.append((test_name, False))
            import traceback
            traceback.print_exc()

    print("\n" + "=" * 60)
    print("Test Summary")
    print("=" * 60)
    passed = sum(1 for _, success in results if success)
    total = len(results)
    print(f"Passed: {passed}/{total}")

    if passed == total:
        print("✓ All tests passed!")
        return 0
    else:
        print("✗ Some tests failed")
        return 1


if __name__ == '__main__':
    sys.exit(run_tests())
