#!/usr/bin/env python3

import os
import json
import yaml
import subprocess
import sys
import time
from pathlib import Path

def load_package_config():
    """Load the package configuration from aur-packages.yml"""
    with open('aur-packages.yml', 'r') as f:
        config = yaml.safe_load(f)
    return config['packages']

def test_package_build(package_name):
    """Test building a package with paru and return results."""
    print(f"\n=== Testing build for package: {package_name} ===")
    
    # Build result details
    result = {
        "package": package_name,
        "success": False,
        "error": "",
        "log": ""
    }
    
    # Run paru to build the package
    try:
        # Add --needed flag to install dependencies
        # Use -Si to show package info and install
        # Use --asdeps to mark any installed deps as dependencies
        proc = subprocess.run(
            ['paru', '-Siy', package_name, '--asdeps', '--needed', '--cleanafter', '--removemake', '--noconfirm'],
            capture_output=True,
            text=True,
            check=False  # Don't raise exception on non-zero exit code
        )
        
        # Save the output regardless of success
        result["log"] = f"STDOUT:\n{proc.stdout}\n\nSTDERR:\n{proc.stderr}"
        
        if proc.returncode == 0:
            result["success"] = True
            print(f"✅ Package {package_name} built successfully!")
        else:
            result["success"] = False
            result["error"] = f"Failed to build with exit code {proc.returncode}"
            print(f"❌ Package {package_name} build failed with exit code {proc.returncode}")
    except Exception as e:
        result["success"] = False
        result["error"] = str(e)
        print(f"❌ Package {package_name} build test raised exception: {str(e)}")
    
    return result

def write_results(results):
    """Write test results to a JSON file."""
    # Create a directory for the logs
    logs_dir = Path("package_build_logs")
    logs_dir.mkdir(exist_ok=True)
    
    # Write individual log files for each package
    for result in results:
        log_file = logs_dir / f"{result['package']}_build.log"
        with open(log_file, 'w') as f:
            f.write(result["log"])
        
        # Remove the log from the result to avoid duplication
        log_entry = result.pop("log")
        
        # Add a reference to the log file
        result["log_file"] = str(log_file)
    
    # Write the summary results file
    with open('package_build_results.json', 'w') as f:
        json.dump(results, f, indent=2)
    
    print(f"\nWritten detailed logs to {logs_dir}/")
    print(f"Written summary results to package_build_results.json")

def main():
    # Get package configuration
    package_configs = load_package_config()
    
    # Get packages to test from command line or use all configured packages
    if len(sys.argv) > 1:
        packages_to_test = sys.argv[1:]
        # Check if all packages exist in config
        for pkg in packages_to_test:
            if pkg not in package_configs:
                print(f"Warning: {pkg} not found in configuration. Testing anyway.")
    else:
        packages_to_test = list(package_configs.keys())
    
    # Store all results
    all_results = []
    failed_count = 0
    
    # Test each package
    for pkg_name in packages_to_test:
        # Add a delay between package builds to avoid issues
        if all_results:  # Not the first package
            print("Waiting 5 seconds before next package build...")
            time.sleep(5)
        
        result = test_package_build(pkg_name)
        all_results.append(result)
        
        if not result["success"]:
            failed_count += 1
    
    # Write results to file
    write_results(all_results)
    
    # Print summary
    print(f"\n=== Build Test Summary ===")
    print(f"Total packages tested: {len(all_results)}")
    print(f"Successful builds: {len(all_results) - failed_count}")
    print(f"Failed builds: {failed_count}")
    
    # Set exit code based on success
    if failed_count > 0:
        print("\nSome package builds failed. Check package_build_results.json for details.")
        sys.exit(1)
    else:
        print("\nAll package builds succeeded!")
        sys.exit(0)

if __name__ == "__main__":
    main() 