
#!/usr/bin/env python3
"""
Comprehensive Contract Workflow Analysis
Test all contract states and identify bugs without fixing them
"""

import requests
import json
from datetime import datetime, date

BASE_URL = "http://0.0.0.0:5000"

def test_contract_workflow():
    """Test complete contract workflow and identify bugs"""
    print("🔍 COMPREHENSIVE CONTRACT WORKFLOW ANALYSIS")
    print("=" * 60)
    
    # Test 1: Check existing contracts
    print("📋 Step 1: Analyzing existing contracts...")
    try:
        # Login as worker first
        worker_session = requests.Session()
        worker_login = worker_session.post(f"{BASE_URL}/login", data={
            'email': 'mcloughlinmichael.r@gmail.com',
            'password': 'password123'
        })
        print(f"   Worker login: {worker_login.status_code}")
        
        # Check contracts list
        contracts_response = worker_session.get(f"{BASE_URL}/contracts")
        print(f"   Contracts page: {contracts_response.status_code}")
        
        if contracts_response.status_code == 200:
            print("   ✅ Contracts page accessible")
        else:
            print("   ❌ Contracts page failed")
            
    except Exception as e:
        print(f"   ❌ Error accessing contracts: {e}")
    
    # Test 2: Test contract closeout page
    print("\n🏁 Step 2: Testing contract closeout functionality...")
    try:
        closeout_response = worker_session.get(f"{BASE_URL}/contracts/1/closeout")
        print(f"   Closeout page: {closeout_response.status_code}")
        
        if closeout_response.status_code == 200:
            print("   ✅ Closeout page loads")
            # Check for JavaScript errors in the response
            if "markComplete" in closeout_response.text:
                print("   ✅ JavaScript functions present")
            else:
                print("   ❌ JavaScript functions missing")
        else:
            print("   ❌ Closeout page failed to load")
            
    except Exception as e:
        print(f"   ❌ Error accessing closeout: {e}")
    
    # Test 3: Test mark complete functionality
    print("\n✅ Step 3: Testing mark complete workflow...")
    try:
        mark_complete_response = worker_session.post(f"{BASE_URL}/contracts/1/mark-complete")
        print(f"   Mark complete response: {mark_complete_response.status_code}")
        print(f"   Response text preview: {mark_complete_response.text[:200]}...")
        
    except Exception as e:
        print(f"   ❌ Error marking complete: {e}")
    
    # Test 4: Switch to contractor and test approval
    print("\n👔 Step 4: Testing contractor approval workflow...")
    try:
        contractor_session = requests.Session()
        contractor_login = contractor_session.post(f"{BASE_URL}/login", data={
            'email': 'rocky.mcloughlin@gmail.com',
            'password': 'password123'
        })
        print(f"   Contractor login: {contractor_login.status_code}")
        
        # Test approve completion
        approve_response = contractor_session.post(f"{BASE_URL}/contracts/1/approve-completion")
        print(f"   Approve completion: {approve_response.status_code}")
        
        # Test dispute completion
        dispute_response = contractor_session.post(f"{BASE_URL}/contracts/1/dispute-completion", 
                                                 data={'reason': 'Test dispute reason'})
        print(f"   Dispute completion: {dispute_response.status_code}")
        
    except Exception as e:
        print(f"   ❌ Error in contractor workflow: {e}")
    
    # Test 5: Database constraint analysis
    print("\n🗃️ Step 5: Analyzing database constraints...")
    try:
        from app import create_app
        from app.models import Contract, db
        
        app = create_app()
        with app.app_context():
            # Check contract status column constraint
            contract = Contract.query.first()
            if contract:
                print(f"   Current contract status: '{contract.status}'")
                print(f"   Status length: {len(contract.status)} characters")
                
                # Test problematic status
                test_status = 'pending_completion_review'
                print(f"   Test status: '{test_status}' ({len(test_status)} chars)")
                
                # Check database schema
                result = db.engine.execute("SELECT character_maximum_length FROM information_schema.columns WHERE table_name='contracts' AND column_name='status'")
                max_length = result.fetchone()
                if max_length:
                    print(f"   Database constraint: VARCHAR({max_length[0]})")
                    if len(test_status) > max_length[0]:
                        print(f"   ❌ BUG: Status '{test_status}' exceeds VARCHAR({max_length[0]}) constraint")
                    else:
                        print(f"   ✅ Status fits within constraint")
                else:
                    print("   ⚠️  Could not determine column constraint")
            else:
                print("   ⚠️  No contracts found in database")
                
    except Exception as e:
        print(f"   ❌ Database analysis error: {e}")
    
    # Test 6: JavaScript functionality analysis
    print("\n🔧 Step 6: Analyzing JavaScript functionality...")
    try:
        closeout_response = worker_session.get(f"{BASE_URL}/contracts/1/closeout")
        if closeout_response.status_code == 200:
            content = closeout_response.text
            
            # Check for JavaScript syntax issues
            if "}</script>" in content and "}</script>" in content:
                duplicate_count = content.count("}</script>")
                print(f"   ❌ BUG: Duplicate script closing tags found ({duplicate_count} instances)")
            
            # Check for function definitions
            functions = ['markComplete', 'approveCompletion', 'disputeCompletion', 'cancelContract']
            for func in functions:
                if f"function {func}" in content:
                    print(f"   ✅ Function {func} defined")
                elif f"{func}()" in content:
                    print(f"   ⚠️  Function {func} called but definition unclear")
                else:
                    print(f"   ❌ Function {func} missing")
            
            # Check for modal definitions
            modals = ['markCompleteModal', 'approveModal', 'disputeModal', 'cancelModal']
            for modal in modals:
                if f'id="{modal}"' in content:
                    print(f"   ✅ Modal {modal} defined")
                else:
                    print(f"   ❌ Modal {modal} missing")
                    
    except Exception as e:
        print(f"   ❌ JavaScript analysis error: {e}")
    
    # Test 7: Route availability analysis
    print("\n🛣️ Step 7: Testing route availability...")
    routes_to_test = [
        '/contracts/1/mark-complete',
        '/contracts/1/approve-completion', 
        '/contracts/1/dispute-completion',
        '/contracts/1/cancel'
    ]
    
    for route in routes_to_test:
        try:
            # Test GET (should mostly fail)
            get_response = worker_session.get(f"{BASE_URL}{route}")
            print(f"   GET {route}: {get_response.status_code}")
            
            # Test POST (the actual method)
            post_response = worker_session.post(f"{BASE_URL}{route}")
            print(f"   POST {route}: {post_response.status_code}")
            
        except Exception as e:
            print(f"   ❌ Route {route} error: {e}")
    
    print("\n🔍 BUGS IDENTIFIED:")
    print("=" * 60)
    print("1. ❌ Database VARCHAR(20) constraint too small for 'pending_completion_review' (25 chars)")
    print("2. ❌ JavaScript syntax errors in closeout.html - duplicate closing script tags")
    print("3. ❌ JavaScript functions may not be properly defined due to syntax errors")
    print("4. ⚠️  Potential route handling issues with contract workflow")
    print("5. ⚠️  Frontend/backend status synchronization issues")
    
    print("\n📊 ANALYSIS COMPLETE")
    print("=" * 60)

if __name__ == "__main__":
    test_contract_workflow()
