
#!/usr/bin/env python3
"""
Test Rating Form Submission After Job Completion
Tests the complete workflow from job completion to rating submission
"""

import requests
import json
from datetime import datetime

BASE_URL = "http://0.0.0.0:5000"

def test_rating_workflow():
    """Test the complete rating workflow"""
    print("🧪 TESTING RATING FORM SUBMISSION WORKFLOW")
    print("=" * 50)
    
    # Test data - using Contract 7 from diagnostic output
    contract_id = 7
    worker_user_id = 3  # Assuming worker user ID
    contractor_user_id = 2  # Assuming contractor user ID
    
    print(f"📋 Testing Contract ID: {contract_id}")
    print(f"👷 Worker User ID: {worker_user_id}")
    print(f"👔 Contractor User ID: {contractor_user_id}")
    print()
    
    # Step 1: Check initial contract status
    print("1️⃣ CHECKING INITIAL CONTRACT STATUS...")
    try:
        response = requests.get(f"{BASE_URL}/api/marketplace/contracts/{contract_id}")
        if response.status_code == 200:
            contract_data = response.json()
            print(f"   ✅ Contract Status: {contract_data.get('status', 'Unknown')}")
            print(f"   ✅ Job Status: {contract_data.get('job', {}).get('status', 'Unknown')}")
        else:
            print(f"   ❌ Failed to get contract: {response.status_code}")
            return False
    except Exception as e:
        print(f"   ❌ Error getting contract: {e}")
        return False
    
    print()
    
    # Step 2: Complete the job (mark as completed)
    print("2️⃣ MARKING JOB AS COMPLETED...")
    try:
        # First, update job status to completed
        job_complete_data = {
            'status': 'completed',
            'completion_notes': 'Job completed successfully - ready for review'
        }
        
        job_response = requests.put(
            f"{BASE_URL}/api/marketplace/jobs/{contract_data.get('job_id')}/complete",
            json=job_complete_data
        )
        
        if job_response.status_code == 200:
            print("   ✅ Job marked as completed")
        else:
            print(f"   ⚠️  Job completion endpoint not found, continuing with contract workflow...")
        
    except Exception as e:
        print(f"   ⚠️  Job completion failed: {e}, continuing...")
    
    print()
    
    # Step 3: Worker marks contract work complete
    print("3️⃣ WORKER MARKS CONTRACT WORK COMPLETE...")
    try:
        worker_complete_data = {
            'action': 'mark_complete',
            'completion_notes': 'All work completed as per contract requirements'
        }
        
        worker_response = requests.post(
            f"{BASE_URL}/api/marketplace/contracts/{contract_id}/worker-complete",
            json=worker_complete_data
        )
        
        if worker_response.status_code == 200:
            result = worker_response.json()
            print(f"   ✅ Worker completion: {result.get('message', 'Success')}")
            print(f"   ✅ New status: {result.get('status', 'Unknown')}")
        else:
            print(f"   ❌ Worker completion failed: {worker_response.status_code}")
            print(f"   📄 Response: {worker_response.text}")
    except Exception as e:
        print(f"   ❌ Error in worker completion: {e}")
    
    print()
    
    # Step 4: Contractor approves completion
    print("4️⃣ CONTRACTOR APPROVES COMPLETION...")
    try:
        contractor_approve_data = {
            'action': 'approve',
            'review_notes': 'Work approved - meets all requirements'
        }
        
        contractor_response = requests.post(
            f"{BASE_URL}/api/marketplace/contracts/{contract_id}/review-completion",
            json=contractor_approve_data
        )
        
        if contractor_response.status_code == 200:
            result = contractor_response.json()
            print(f"   ✅ Contractor approval: {result.get('message', 'Success')}")
            print(f"   ✅ New status: {result.get('status', 'Unknown')}")
        else:
            print(f"   ❌ Contractor approval failed: {contractor_response.status_code}")
            print(f"   📄 Response: {contractor_response.text}")
    except Exception as e:
        print(f"   ❌ Error in contractor approval: {e}")
    
    print()
    
    # Step 5: Verify contract is ready for rating
    print("5️⃣ VERIFYING CONTRACT IS READY FOR RATING...")
    try:
        response = requests.get(f"{BASE_URL}/api/marketplace/contracts/{contract_id}")
        if response.status_code == 200:
            contract_data = response.json()
            contract_status = contract_data.get('status', 'Unknown')
            job_status = contract_data.get('job', {}).get('status', 'Unknown')
            
            print(f"   📊 Contract Status: {contract_status}")
            print(f"   📊 Job Status: {job_status}")
            
            if contract_status == 'pending_rating' and job_status == 'completed':
                print("   ✅ Contract is ready for rating!")
            else:
                print(f"   ⚠️  Contract may not be ready for rating")
                print(f"   📝 Expected: contract='pending_rating', job='completed'")
                print(f"   📝 Actual: contract='{contract_status}', job='{job_status}'")
        else:
            print(f"   ❌ Failed to verify status: {response.status_code}")
    except Exception as e:
        print(f"   ❌ Error verifying status: {e}")
    
    print()
    
    # Step 6: Test rating form submission - Worker rates Contractor
    print("6️⃣ WORKER SUBMITS RATING FOR CONTRACTOR...")
    try:
        worker_rating_data = {
            'rating_professionalism': 5,
            'rating_quality': 4,
            'rating_communication': 5,
            'rating_timeliness': 4,
            'review_text': 'Excellent contractor! Clear communication, fair rates, and prompt payment. Would definitely work with again.',
            'would_recommend': True
        }
        
        worker_rating_response = requests.post(
            f"{BASE_URL}/contracts/{contract_id}/rate",
            data=worker_rating_data
        )
        
        print(f"   📡 Request URL: /contracts/{contract_id}/rate")
        print(f"   📤 Request Data: {json.dumps(worker_rating_data, indent=2)}")
        print(f"   📊 Response Status: {worker_rating_response.status_code}")
        
        if worker_rating_response.status_code == 200:
            try:
                rating_result = worker_rating_response.json()
                print(f"   ✅ Worker rating submitted successfully!")
                print(f"   💬 Message: {rating_result.get('message', 'Success')}")
                if 'anonymous_note' in rating_result:
                    print(f"   🔒 {rating_result['anonymous_note']}")
            except:
                print(f"   ✅ Worker rating submitted (HTML response)")
        elif worker_rating_response.status_code == 302:
            print(f"   ✅ Worker rating submitted (redirect response)")
            print(f"   🔗 Redirect location: {worker_rating_response.headers.get('Location', 'Unknown')}")
        else:
            print(f"   ❌ Worker rating failed: {worker_rating_response.status_code}")
            print(f"   📄 Response: {worker_rating_response.text[:500]}")
    except Exception as e:
        print(f"   ❌ Error in worker rating: {e}")
    
    print()
    
    # Step 7: Test rating form submission - Contractor rates Worker
    print("7️⃣ CONTRACTOR SUBMITS RATING FOR WORKER...")
    try:
        contractor_rating_data = {
            'rating_professionalism': 5,
            'rating_quality': 5,
            'rating_communication': 4,
            'rating_timeliness': 5,
            'review_text': 'Outstanding worker! High quality work, professional attitude, and completed on time. Highly recommended!',
            'would_recommend': True
        }
        
        contractor_rating_response = requests.post(
            f"{BASE_URL}/contracts/{contract_id}/rate",
            data=contractor_rating_data
        )
        
        print(f"   📡 Request URL: /contracts/{contract_id}/rate")
        print(f"   📤 Request Data: {json.dumps(contractor_rating_data, indent=2)}")
        print(f"   📊 Response Status: {contractor_rating_response.status_code}")
        
        if contractor_rating_response.status_code == 200:
            try:
                rating_result = contractor_rating_response.json()
                print(f"   ✅ Contractor rating submitted successfully!")
                print(f"   💬 Message: {rating_result.get('message', 'Success')}")
                if 'anonymous_note' in rating_result:
                    print(f"   🔒 {rating_result['anonymous_note']}")
            except:
                print(f"   ✅ Contractor rating submitted (HTML response)")
        elif contractor_rating_response.status_code == 302:
            print(f"   ✅ Contractor rating submitted (redirect response)")
            print(f"   🔗 Redirect location: {contractor_rating_response.headers.get('Location', 'Unknown')}")
        else:
            print(f"   ❌ Contractor rating failed: {contractor_rating_response.status_code}")
            print(f"   📄 Response: {contractor_rating_response.text[:500]}")
    except Exception as e:
        print(f"   ❌ Error in contractor rating: {e}")
    
    print()
    
    # Step 8: Verify final contract status
    print("8️⃣ VERIFYING FINAL CONTRACT STATUS...")
    try:
        response = requests.get(f"{BASE_URL}/api/marketplace/contracts/{contract_id}")
        if response.status_code == 200:
            contract_data = response.json()
            final_status = contract_data.get('status', 'Unknown')
            print(f"   📊 Final Contract Status: {final_status}")
            
            if final_status == 'completed':
                print("   ✅ Contract workflow completed successfully!")
            else:
                print(f"   ⚠️  Contract status: {final_status}")
        else:
            print(f"   ❌ Failed to get final status: {response.status_code}")
    except Exception as e:
        print(f"   ❌ Error getting final status: {e}")
    
    print()
    
    # Step 9: Check ratings in database
    print("9️⃣ CHECKING RATINGS IN DATABASE...")
    try:
        # Try to get reviews for this contract
        reviews_response = requests.get(f"{BASE_URL}/api/safety/reviews/contract/{contract_id}")
        if reviews_response.status_code == 200:
            reviews_data = reviews_response.json()
            print(f"   ✅ Found {len(reviews_data.get('reviews', []))} reviews")
            for i, review in enumerate(reviews_data.get('reviews', []), 1):
                print(f"   📝 Review {i}: {review.get('rating_overall', 'N/A')}/5 stars")
        else:
            print(f"   ⚠️  Reviews endpoint not available: {reviews_response.status_code}")
    except Exception as e:
        print(f"   ⚠️  Error checking reviews: {e}")
    
    print()
    print("🏁 RATING WORKFLOW TEST COMPLETED")
    print("=" * 50)


if __name__ == "__main__":
    print(f"🚀 Starting Rating Form Submission Test at {datetime.now()}")
    print(f"🌐 Base URL: {BASE_URL}")
    print()
    
    # Check if server is running
    try:
        health_response = requests.get(BASE_URL, timeout=5)
        print(f"✅ Server is running (Status: {health_response.status_code})")
    except Exception as e:
        print(f"❌ Server not accessible: {e}")
        print("🔧 Make sure your Flask server is running on port 5000")
        exit(1)
    
    print()
    test_rating_workflow()
