
#!/usr/bin/env python3
"""
Create Test Contracts for Closeout Testing
Generates contracts in different states to test the complete closeout workflow
"""

from app import create_app
from app.extensions import db
from app.models.contract import Contract
from app.models.job import Job
from app.models.user import User
from datetime import datetime, date, timedelta

app = create_app()

print("🏗️  CREATING TEST CONTRACTS FOR CLOSEOUT")
print("=" * 60)

with app.app_context():
    # Get users
    worker = User.query.filter_by(role='worker').first()
    contractor = User.query.filter_by(role='contractor').first()
    
    if not worker:
        print("❌ No worker found - creating test worker")
        worker = User(
            email='test.worker@rateright.com',
            first_name='Mike',
            last_name='Worker',
            role='worker',
            phone_number='0400000001'
        )
        worker.set_password('password123')
        db.session.add(worker)
        db.session.commit()
    
    if not contractor:
        print("❌ No contractor found - creating test contractor")
        contractor = User(
            email='test.contractor@rateright.com',
            first_name='John',
            last_name='Contractor',
            role='contractor',
            phone_number='0400000002'
        )
        contractor.set_password('password123')
        db.session.add(contractor)
        db.session.commit()
    
    # Get or create a job
    job = Job.query.filter_by(contractor_id=contractor.id).first()
    if not job:
        job = Job(
            title="Test Carpentry Project",
            description="Build custom kitchen cabinets and install fixtures",
            contractor_id=contractor.id,
            category_id=1,
            location="Sydney, NSW",
            budget_min=800,
            budget_max=1200,
            status='open',
            white_card_required=True,
            insurance_required=True
        )
        db.session.add(job)
        db.session.commit()
    
    # Clear existing test contracts
    existing_contracts = Contract.query.filter_by(
        contractor_id=contractor.id,
        worker_id=worker.id
    ).all()
    
    for contract in existing_contracts:
        db.session.delete(contract)
    
    db.session.commit()
    
    # Create contracts in different states for testing
    test_contracts = []
    
    # 1. Active contract ready for worker to mark complete
    contract1 = Contract(
        job_id=job.id,
        contractor_id=contractor.id,
        worker_id=worker.id,
        agreed_rate=950.00,
        rate_type='total',
        start_date=date.today() - timedelta(days=7),
        end_date=date.today() + timedelta(days=3),
        scope_of_work="Build and install custom kitchen cabinets - Phase 1",
        status='active',
        completion_status='in_progress',
        payment_status='pending',
        contractor_signed=True,
        worker_signed=True,
        contractor_signed_date=datetime.utcnow() - timedelta(days=7),
        worker_signed_date=datetime.utcnow() - timedelta(days=7),
        contractor_reviewed=True,
        worker_reviewed=True,
        payment_terms='completion'
    )
    
    # 2. Contract where worker has marked complete, waiting for contractor approval
    contract2 = Contract(
        job_id=job.id,
        contractor_id=contractor.id,
        worker_id=worker.id,
        agreed_rate=1150.00,
        rate_type='total',
        start_date=date.today() - timedelta(days=14),
        end_date=date.today() - timedelta(days=2),
        scope_of_work="Install kitchen fixtures and hardware - Phase 2",
        status='pending_completion_review',
        completion_status='worker_completed',
        payment_status='pending',
        contractor_signed=True,
        worker_signed=True,
        contractor_signed_date=datetime.utcnow() - timedelta(days=14),
        worker_signed_date=datetime.utcnow() - timedelta(days=14),
        contractor_reviewed=True,
        worker_reviewed=True,
        worker_completion_date=datetime.utcnow() - timedelta(hours=6),
        payment_terms='completion'
    )
    
    # 3. Completed contract ready for mutual ratings
    contract3 = Contract(
        job_id=job.id,
        contractor_id=contractor.id,
        worker_id=worker.id,
        agreed_rate=750.00,
        rate_type='total',
        start_date=date.today() - timedelta(days=21),
        end_date=date.today() - timedelta(days=7),
        scope_of_work="Final finishing and cleanup work",
        status='completed',
        completion_status='contractor_approved',
        payment_status='released',
        contractor_signed=True,
        worker_signed=True,
        contractor_signed_date=datetime.utcnow() - timedelta(days=21),
        worker_signed_date=datetime.utcnow() - timedelta(days=21),
        contractor_reviewed=True,
        worker_reviewed=True,
        worker_completion_date=datetime.utcnow() - timedelta(days=2),
        contractor_approval_date=datetime.utcnow() - timedelta(days=1),
        contractor_rated=False,
        worker_rated=False,
        payment_terms='completion'
    )
    
    # 4. Another active contract for variety
    contract4 = Contract(
        job_id=job.id,
        contractor_id=contractor.id,
        worker_id=worker.id,
        agreed_rate=650.00,
        rate_type='total',
        start_date=date.today() - timedelta(days=3),
        end_date=date.today() + timedelta(days=10),
        scope_of_work="Additional custom shelving work",
        status='active',
        completion_status='not_started',
        payment_status='pending',
        contractor_signed=True,
        worker_signed=True,
        contractor_signed_date=datetime.utcnow() - timedelta(days=3),
        worker_signed_date=datetime.utcnow() - timedelta(days=3),
        contractor_reviewed=True,
        worker_reviewed=True,
        payment_terms='completion'
    )
    
    test_contracts = [contract1, contract2, contract3, contract4]
    
    for contract in test_contracts:
        db.session.add(contract)
    
    db.session.commit()
    
    print(f"\n✅ CREATED {len(test_contracts)} TEST CONTRACTS!")
    print(f"\n📋 CONTRACT SUMMARY:")
    print(f"👷 Worker: {worker.first_name} {worker.last_name} (ID: {worker.id})")
    print(f"👔 Contractor: {contractor.first_name} {contractor.last_name} (ID: {contractor.id})")
    print(f"🏗️  Job: {job.title} (ID: {job.id})")
    
    print(f"\n🎯 TEST SCENARIOS:")
    print(f"")
    print(f"Contract #{contract1.id} - ACTIVE (${contract1.agreed_rate})")
    print(f"   Status: {contract1.status}")
    print(f"   Action: Worker can mark as complete")
    print(f"   Description: {contract1.scope_of_work}")
    
    print(f"")
    print(f"Contract #{contract2.id} - PENDING REVIEW (${contract2.agreed_rate})")
    print(f"   Status: {contract2.status}")
    print(f"   Action: Contractor can approve completion")
    print(f"   Description: {contract2.scope_of_work}")
    
    print(f"")
    print(f"Contract #{contract3.id} - COMPLETED (${contract3.agreed_rate})")
    print(f"   Status: {contract3.status}")
    print(f"   Action: Both parties can submit ratings")
    print(f"   Description: {contract3.scope_of_work}")
    
    print(f"")
    print(f"Contract #{contract4.id} - ACTIVE (${contract4.agreed_rate})")
    print(f"   Status: {contract4.status}")
    print(f"   Action: Just started - worker can begin or mark complete")
    print(f"   Description: {contract4.scope_of_work}")
    
    print(f"\n🔐 LOGIN CREDENTIALS:")
    print(f"Worker Login:")
    print(f"  Email: {worker.email}")
    print(f"  Password: password123")
    print(f"")
    print(f"Contractor Login:")
    print(f"  Email: {contractor.email}")
    print(f"  Password: password123")
    
    print(f"\n🚀 TESTING WORKFLOW:")
    print(f"1. Login as Worker → Go to Dashboard → See contracts needing attention")
    print(f"2. Click 'Rate & Get Paid' on Contract #{contract1.id}")
    print(f"3. Mark work as complete")
    print(f"4. Login as Contractor → Approve the completion")
    print(f"5. Both parties submit ratings")
    print(f"6. Test Contract #{contract2.id} (already pending contractor approval)")
    print(f"7. Test Contract #{contract3.id} (ready for ratings)")
    
    print(f"\n🎉 Ready for closeout testing!")
