"""
Test script to verify project_id is included in admin API responses.

This script tests the admin API endpoints to ensure project_id is properly
included in the responses for deleted shots and recovery operations.
"""

import sys
import os
sys.path.append('.')

import requests
import json
from database import get_db
from models.shot import Shot
from models.user import User


def get_auth_token():
    """Get authentication token for admin user."""
    login_data = {
        "email": "admin@vfx.com",
        "password": "admin123"
    }
    
    response = requests.post("http://localhost:8000/auth/login", json=login_data)
    if response.status_code == 200:
        return response.json()["access_token"]
    else:
        print(f"Failed to login: {response.status_code} - {response.text}")
        return None


def test_deleted_shots_api():
    """Test the deleted shots API endpoint includes project_id."""
    print("Testing /admin/deleted-shots/ API endpoint...")
    
    token = get_auth_token()
    if not token:
        print("✗ Failed to get auth token")
        return False
    
    headers = {"Authorization": f"Bearer {token}"}
    
    try:
        response = requests.get("http://localhost:8000/admin/deleted-shots/", headers=headers)
        
        if response.status_code == 200:
            deleted_shots = response.json()
            print(f"✓ API call successful, found {len(deleted_shots)} deleted shots")
            
            if deleted_shots:
                # Check first shot for project_id
                first_shot = deleted_shots[0]
                if 'project_id' in first_shot:
                    print(f"✓ project_id field present: {first_shot['project_id']}")
                    print(f"✓ project_name field present: {first_shot['project_name']}")
                    return True
                else:
                    print("✗ project_id field missing from API response")
                    print(f"Available fields: {list(first_shot.keys())}")
                    return False
            else:
                print("✓ No deleted shots found, but API structure is correct")
                return True
        else:
            print(f"✗ API call failed: {response.status_code} - {response.text}")
            return False
            
    except Exception as e:
        print(f"✗ Error testing API: {str(e)}")
        return False


def test_recovery_preview_api():
    """Test the recovery preview API endpoint includes project_id."""
    print("\nTesting recovery preview API endpoint...")
    
    token = get_auth_token()
    if not token:
        print("✗ Failed to get auth token")
        return False
    
    headers = {"Authorization": f"Bearer {token}"}
    
    try:
        # First get list of deleted shots
        response = requests.get("http://localhost:8000/admin/deleted-shots/", headers=headers)
        
        if response.status_code == 200:
            deleted_shots = response.json()
            
            if deleted_shots:
                # Test recovery preview for first deleted shot
                shot_id = deleted_shots[0]['id']
                print(f"Testing recovery preview for shot ID: {shot_id}")
                
                preview_response = requests.get(
                    f"http://localhost:8000/admin/shots/{shot_id}/recovery-preview",
                    headers=headers
                )
                
                if preview_response.status_code == 200:
                    preview_data = preview_response.json()
                    print("✓ Recovery preview API call successful")
                    
                    if 'project_id' in preview_data:
                        print(f"✓ project_id field present: {preview_data['project_id']}")
                        print(f"✓ project_name field present: {preview_data['project_name']}")
                        return True
                    else:
                        print("✗ project_id field missing from recovery preview response")
                        print(f"Available fields: {list(preview_data.keys())}")
                        return False
                else:
                    print(f"✗ Recovery preview API call failed: {preview_response.status_code}")
                    return False
            else:
                print("✓ No deleted shots found to test recovery preview")
                return True
        else:
            print(f"✗ Failed to get deleted shots list: {response.status_code}")
            return False
            
    except Exception as e:
        print(f"✗ Error testing recovery preview API: {str(e)}")
        return False


def test_project_filtering():
    """Test project filtering in deleted shots API."""
    print("\nTesting project filtering in deleted shots API...")
    
    token = get_auth_token()
    if not token:
        print("✗ Failed to get auth token")
        return False
    
    headers = {"Authorization": f"Bearer {token}"}
    
    try:
        # Get all deleted shots
        response = requests.get("http://localhost:8000/admin/deleted-shots/", headers=headers)
        
        if response.status_code == 200:
            all_deleted_shots = response.json()
            print(f"✓ Found {len(all_deleted_shots)} total deleted shots")
            
            if all_deleted_shots:
                # Test filtering by project_id
                project_id = all_deleted_shots[0]['project_id']
                print(f"Testing filter by project_id: {project_id}")
                
                filtered_response = requests.get(
                    f"http://localhost:8000/admin/deleted-shots/?project_id={project_id}",
                    headers=headers
                )
                
                if filtered_response.status_code == 200:
                    filtered_shots = filtered_response.json()
                    print(f"✓ Filtered API call successful, found {len(filtered_shots)} shots")
                    
                    # Verify all returned shots have the correct project_id
                    if all(shot['project_id'] == project_id for shot in filtered_shots):
                        print("✓ All filtered shots have correct project_id")
                        return True
                    else:
                        print("✗ Some filtered shots have incorrect project_id")
                        return False
                else:
                    print(f"✗ Filtered API call failed: {filtered_response.status_code}")
                    return False
            else:
                print("✓ No deleted shots found to test filtering")
                return True
        else:
            print(f"✗ Failed to get deleted shots: {response.status_code}")
            return False
            
    except Exception as e:
        print(f"✗ Error testing project filtering: {str(e)}")
        return False


if __name__ == "__main__":
    print("Starting admin API project_id tests...")
    print("Note: This test requires the backend server to be running on localhost:8000")
    
    results = []
    results.append(test_deleted_shots_api())
    results.append(test_recovery_preview_api())
    results.append(test_project_filtering())
    
    print(f"\n{'='*60}")
    print("Test Results:")
    print(f"✓ Passed: {sum(results)}")
    print(f"✗ Failed: {len(results) - sum(results)}")
    
    if all(results):
        print("\n🎉 All admin API project_id tests passed!")
    else:
        print("\n❌ Some API tests failed!")
    
    print(f"{'='*60}")