
#!/usr/bin/env python3
"""
Test Contract Closeout API - Complete Workflow
Tests the full contract marketplace closeout system
"""

import requests
import json
from datetime import datetime

BASE_URL = "http://0.0.0.0:5000"

def test_contract_closeout_api():
    """Test complete contract closeout workflow via API"""
    print("🧪 TESTING CONTRACT CLOSEOUT API")
    print("=" * 60)
    
    # Test 1: Check Contract #1 Status
    print("\n📋 Step 1: Check Contract #1 current status...")
    try:
        # Mock session data for worker (user_id=1)
        worker_session = requests.Session()
        
        # Get closeout status
        status_response = worker_session.get(f"{BASE_URL}/api/closeout/contracts/1/closeout-status")
        print(f"   Status endpoint: {status_response.status_code}")
        
        if status_response.status_code == 200:
            status_data = status_response.json()
            print(f"   ✅ Contract status: {status_data.get('status', 'unknown')}")
            print(f"   ✅ User role: {status_data.get('user_role', 'unknown')}")
        else:
            print(f"   ❌ Status check failed: {status_response.text}")
            
    except Exception as e:
        print(f"   ❌ Error checking status: {e}")
    
    # Test 2: Worker marks work complete
    print("\n🔨 Step 2: Worker marks work complete with hours...")
    try:
        mark_complete_data = {
            'actual_hours_worked': 25.5,
            'completion_notes': 'Steel fixing completed as per drawings. All rebar tied and inspected.'
        }
        
        complete_response = worker_session.post(
            f"{BASE_URL}/api/closeout/contracts/1/mark-complete",
            data=mark_complete_data
        )
        print(f"   Mark complete: {complete_response.status_code}")
        
        if complete_response.status_code == 200:
            complete_data = complete_response.json()
            print(f"   ✅ {complete_data.get('message', 'Success')}")
            print(f"   ✅ New status: {complete_data.get('status', 'unknown')}")
        else:
            print(f"   ❌ Mark complete failed: {complete_response.text}")
            
    except Exception as e:
        print(f"   ❌ Error marking complete: {e}")
    
    # Test 3: Contractor reviews work
    print("\n👔 Step 3: Contractor reviews completed work...")
    try:
        contractor_session = requests.Session()
        
        # Test approve action
        approve_data = {'action': 'approve'}
        
        review_response = contractor_session.post(
            f"{BASE_URL}/api/closeout/contracts/1/contractor-review",
            data=approve_data
        )
        print(f"   Contractor review: {review_response.status_code}")
        
        if review_response.status_code == 200:
            review_data = review_response.json()
            print(f"   ✅ {review_data.get('message', 'Success')}")
            print(f"   ✅ New status: {review_data.get('status', 'unknown')}")
        else:
            print(f"   ❌ Contractor review failed: {review_response.text}")
            
    except Exception as e:
        print(f"   ❌ Error in contractor review: {e}")
    
    # Test 4: Worker submits rating
    print("\n⭐ Step 4: Worker submits anonymous rating...")
    try:
        worker_rating_data = {
            'rating_professionalism': 5,
            'rating_quality': 4,
            'rating_communication': 5,
            'review_text': 'Great contractor, clear requirements and prompt payment.'
        }
        
        worker_rating_response = worker_session.post(
            f"{BASE_URL}/api/closeout/contracts/1/rate",
            data=worker_rating_data
        )
        print(f"   Worker rating: {worker_rating_response.status_code}")
        
        if worker_rating_response.status_code == 200:
            rating_data = worker_rating_response.json()
            print(f"   ✅ {rating_data.get('message', 'Success')}")
            print(f"   ✅ {rating_data.get('anonymous_note', '')}")
        else:
            print(f"   ❌ Worker rating failed: {worker_rating_response.text}")
            
    except Exception as e:
        print(f"   ❌ Error in worker rating: {e}")
    
    # Test 5: Contractor submits rating
    print("\n⭐ Step 5: Contractor submits anonymous rating...")
    try:
        contractor_rating_data = {
            'rating_professionalism': 5,
            'rating_quality': 5,
            'rating_communication': 4,
            'review_text': 'Excellent steelfixer, quality work completed on time.'
        }
        
        contractor_rating_response = contractor_session.post(
            f"{BASE_URL}/api/closeout/contracts/1/rate",
            data=contractor_rating_data
        )
        print(f"   Contractor rating: {contractor_rating_response.status_code}")
        
        if contractor_rating_response.status_code == 200:
            rating_data = contractor_rating_response.json()
            print(f"   ✅ {rating_data.get('message', 'Success')}")
            print(f"   ✅ {rating_data.get('anonymous_note', '')}")
        else:
            print(f"   ❌ Contractor rating failed: {contractor_rating_response.text}")
            
    except Exception as e:
        print(f"   ❌ Error in contractor rating: {e}")
    
    # Test 6: Final status check
    print("\n🏁 Step 6: Final contract status verification...")
    try:
        final_status_response = worker_session.get(f"{BASE_URL}/api/closeout/contracts/1/closeout-status")
        print(f"   Final status check: {final_status_response.status_code}")
        
        if final_status_response.status_code == 200:
            final_data = final_status_response.json()
            print(f"   ✅ Final contract status: {final_data.get('status', 'unknown')}")
            print(f"   ✅ Hours worked: {final_data.get('actual_hours_worked', 'N/A')}")
            print(f"   ✅ Contractor reviewed: {final_data.get('contractor_reviewed', False)}")
            print(f"   ✅ Worker reviewed: {final_data.get('worker_reviewed', False)}")
        else:
            print(f"   ❌ Final status check failed: {final_status_response.text}")
            
    except Exception as e:
        print(f"   ❌ Error in final status check: {e}")
    
    # Test 7: Route verification
    print("\n🛣️ Step 7: Verify all API routes are registered...")
    try:
        routes_to_test = [
            ('/api/closeout/contracts/1/mark-complete', 'POST'),
            ('/api/closeout/contracts/1/contractor-review', 'POST'),
            ('/api/closeout/contracts/1/rate', 'POST'),
            ('/api/closeout/contracts/1/closeout-status', 'GET')
        ]
        
        for route, method in routes_to_test:
            if method == 'GET':
                response = requests.get(f"{BASE_URL}{route}")
            else:
                response = requests.post(f"{BASE_URL}{route}")
            
            # 401/403 is fine, means route exists but needs auth
            # 404 means route not registered
            if response.status_code == 404:
                print(f"   ❌ Route not found: {method} {route}")
            else:
                print(f"   ✅ Route registered: {method} {route} ({response.status_code})")
                
    except Exception as e:
        print(f"   ❌ Error testing routes: {e}")
    
    print("\n🎉 CONTRACT CLOSEOUT API TEST COMPLETE")
    print("=" * 60)

if __name__ == "__main__":
    test_contract_closeout_api()
