#!/usr/bin/env python3
"""
Test script to verify voucher users can get internet access and access logs
Tests the complete flow: voucher redemption → device registration → internet access
"""

import requests
import json

# API base URL
BASE_URL = "http://127.0.0.1:8000/api"

def test_voucher_internet_access():
    """Test complete voucher user internet access flow"""
    print("🎟️ TESTING VOUCHER USER INTERNET ACCESS")
    print("=" * 60)
    
    # Test data
    test_phone = "255888999000"
    test_voucher = "TEST-VOUC-ACC1"  # This should be generated by admin first
    test_mac = "00:11:22:33:55:99"
    test_ip = "192.168.1.200"
    
    print(f"Test User: {test_phone}")
    print(f"Test MAC: {test_mac}")
    print(f"Test IP: {test_ip}")
    print("")
    
    # Step 1: Test voucher redemption with device info
    print("1. Testing Voucher Redemption with Device Info")
    print("-" * 45)
    
    voucher_payload = {
        "voucher_code": test_voucher,
        "phone_number": test_phone,
        "mac_address": test_mac,
        "ip_address": test_ip
    }
    
    try:
        response = requests.post(f"{BASE_URL}/vouchers/redeem/", json=voucher_payload, timeout=10)
        
        print(f"Status Code: {response.status_code}")
        
        if response.status_code == 200:
            data = response.json()
            print("✅ VOUCHER REDEMPTION SUCCESS")
            print(f"   - Message: {data.get('message')}")
            print(f"   - Access Granted: {data.get('access_info', {}).get('has_active_access')}")
            print(f"   - Can Connect to WiFi: {data.get('access_info', {}).get('can_connect_to_wifi')}")
            print(f"   - Device Registered: {data.get('device_info', {}).get('device_registered')}")
            print(f"   - SMS Sent: {data.get('sms_notification_sent')}")
            
            user_data = data.get('user', {})
            print(f"   - User Active: {user_data.get('is_active')}")
            print(f"   - Paid Until: {user_data.get('paid_until')}")
            
        elif response.status_code == 400:
            data = response.json()
            print(f"⚠️  VOUCHER ALREADY USED OR INVALID")
            print(f"   - Message: {data.get('message')}")
            if 'voucher_info' in data:
                voucher_info = data['voucher_info']
                print(f"   - Used At: {voucher_info.get('used_at')}")
                print(f"   - Used By: {voucher_info.get('used_by')}")
        else:
            print(f"❌ FAIL: {response.status_code}")
            print(f"Response: {response.text}")
            
    except requests.exceptions.RequestException as e:
        print(f"❌ ERROR: Request failed - {str(e)}")
    
    # Step 2: Test verify access for voucher user
    print(f"\n2. Testing Verify Access for Voucher User")
    print("-" * 40)
    
    verify_payload = {
        "phone_number": test_phone,
        "mac_address": test_mac,
        "ip_address": test_ip
    }
    
    try:
        response = requests.post(f"{BASE_URL}/verify/", json=verify_payload, timeout=10)
        
        print(f"Status Code: {response.status_code}")
        
        if response.status_code == 200:
            data = response.json()
            access_granted = data.get('access_granted', False)
            access_method = data.get('access_method', 'unknown')
            denial_reason = data.get('denial_reason', '')
            
            if access_granted:
                print("✅ ACCESS VERIFICATION SUCCESS")
                print(f"   - Access Granted: {access_granted}")
                print(f"   - Access Method: {access_method}")
                print(f"   - Debug Info: {json.dumps(data.get('debug_info', {}), indent=6)}")
            else:
                print("❌ ACCESS DENIED")
                print(f"   - Denial Reason: {denial_reason}")
                print(f"   - Access Method: {access_method}")
        else:
            print(f"❌ FAIL: {response.status_code}")
            print(f"Response: {response.text}")
            
    except requests.exceptions.RequestException as e:
        print(f"❌ ERROR: Request failed - {str(e)}")
    
    # Step 3: Test MikroTik authentication for voucher user
    print(f"\n3. Testing MikroTik Authentication for Voucher User")
    print("-" * 50)
    
    mikrotik_data = {
        'username': test_phone,
        'password': '',
        'mac': test_mac,
        'ip': test_ip
    }
    
    try:
        response = requests.post(f"{BASE_URL}/mikrotik/auth/", data=mikrotik_data, timeout=10)
        
        print(f"Status Code: {response.status_code}")
        print(f"Response: {response.text}")
        
        if response.status_code == 200:
            print("✅ MIKROTIK AUTH SUCCESS - User can access internet")
        elif response.status_code == 403:
            print("❌ MIKROTIK AUTH DENIED - No internet access")
        else:
            print(f"⚠️  UNEXPECTED STATUS: {response.status_code}")
            
    except requests.exceptions.RequestException as e:
        print(f"❌ ERROR: Request failed - {str(e)}")
    
    # Step 4: Check user status and access details
    print(f"\n4. Checking User Status and Access Details")
    print("-" * 40)
    
    try:
        response = requests.get(f"{BASE_URL}/mikrotik/user-status/?username={test_phone}", timeout=10)
        
        print(f"Status Code: {response.status_code}")
        
        if response.status_code == 200:
            data = response.json()
            user_summary = data.get('user_summary', {})
            access_details = data.get('access_details', {})
            
            print("✅ USER STATUS RETRIEVED")
            print(f"   - Has Active Access: {user_summary.get('has_active_access')}")
            print(f"   - Paid Until: {user_summary.get('paid_until')}")
            print(f"   - Access Method: {access_details.get('access_method')}")
            print(f"   - Last Extension Source: {access_details.get('last_extension_source')}")
            print(f"   - Device Count: {user_summary.get('device_count')}/{user_summary.get('max_devices')}")
            
            # Show recent activity
            recent_activity = data.get('recent_activity', [])
            if recent_activity:
                print(f"   - Recent Access Logs: {len(recent_activity)} entries")
                for i, log in enumerate(recent_activity[:3]):  # Show first 3
                    print(f"     {i+1}. {log.get('timestamp')}: Access={'✅' if log.get('access_granted') else '❌'}, MAC={log.get('mac_address')}")
        else:
            print(f"❌ FAIL: {response.status_code}")
            print(f"Response: {response.text}")
            
    except requests.exceptions.RequestException as e:
        print(f"❌ ERROR: Request failed - {str(e)}")
    
    # Step 5: Test device listing for voucher user
    print(f"\n5. Testing Device Listing for Voucher User")
    print("-" * 40)
    
    try:
        response = requests.get(f"{BASE_URL}/devices/{test_phone}/", timeout=10)
        
        print(f"Status Code: {response.status_code}")
        
        if response.status_code == 200:
            data = response.json()
            devices = data.get('devices', [])
            
            print("✅ DEVICE LIST RETRIEVED")
            print(f"   - Max Devices: {data.get('max_devices')}")
            print(f"   - Active Devices: {data.get('active_devices')}")
            print(f"   - Total Devices: {len(devices)}")
            
            for i, device in enumerate(devices):
                print(f"     {i+1}. MAC: {device.get('mac_address')}, Active: {'✅' if device.get('is_active') else '❌'}")
        else:
            print(f"❌ FAIL: {response.status_code}")
            print(f"Response: {response.text}")
            
    except requests.exceptions.RequestException as e:
        print(f"❌ ERROR: Request failed - {str(e)}")

def create_test_voucher():
    """Helper to create a test voucher (requires admin token)"""
    print("\n📝 NOTE: To test voucher redemption, you need to:")
    print("1. Generate a voucher using the admin API:")
    print("   POST /api/vouchers/generate/")
    print("   with admin token and phone number")
    print("2. Or use an existing unused voucher code")
    print("3. Update the test_voucher variable in this script")

def main():
    print("🎟️ VOUCHER USER INTERNET ACCESS TEST")
    print("=" * 70)
    print("This script tests the complete flow for voucher users:")
    print("- Voucher redemption with device registration")
    print("- Access verification")
    print("- MikroTik authentication") 
    print("- Device management")
    print("- Access logging")
    print("")
    
    try:
        test_voucher_internet_access()
        
        print(f"\n✅ TESTING COMPLETED")
        print("=" * 30)
        print("Summary of what should work for voucher users:")
        print("✅ Redeem voucher → User account created")
        print("✅ Device registered → MAC address tracked")
        print("✅ Access granted → Internet connectivity")
        print("✅ Logs created → Access attempts recorded")
        print("✅ Status available → Can check remaining time")
        
        create_test_voucher()
        
    except Exception as e:
        print(f"❌ Test failed: {str(e)}")
        import traceback
        traceback.print_exc()

if __name__ == "__main__":
    main()
