
from database_setup import create_database
from models import db, User, Category, Job, Application, Contract, Payment, Invoice
from datetime import datetime, timedelta, date

def test_chunk3():
    app = create_database()
    
    with app.app_context():
        print("🧪 Testing CHUNK 3: Legal Compliance Models...")
        
        # Clear existing data
        db.drop_all()
        db.create_all()
        
        # Create test users
        contractor = User(
            email='contractor@rateright.com.au',
            first_name='Sarah',
            last_name='Wilson',
            role='contractor',
            phone_number='0412345678',
            location='Melbourne, VIC',
            business_name='Wilson Construction',
            abn_number='12345678901',
            gst_registered=True
        )
        contractor.set_password('password123')
        db.session.add(contractor)
        
        worker = User(
            email='worker@rateright.com.au',
            first_name='David',
            last_name='Chen',
            role='worker',
            phone_number='0423456789',
            location='Melbourne, VIC',
            primary_trade='Electrician',
            abn_number='98765432109',
            gst_registered=True,
            public_liability_insurance='ALLIANZ-PL-2025-001',
            public_liability_amount=20000000.00
        )
        worker.set_password('password123')
        db.session.add(worker)
        
        # Create category and job
        category = Category(
            name='Electrician',
            description='Electrical work and installations',
            whs_risk_level='high',
            insurance_requirements='$20M public liability required'
        )
        db.session.add(category)
        
        db.session.commit()
        
        job = Job(
            title='Main Electrical - New Build',
            description='Complete electrical fit-out for 3-story residential.',
            contractor_id=contractor.id,
            category_id=category.id,
            location='Melbourne, VIC',
            budget_min=4000,
            budget_max=6000,
            whs_requirements='Lockout/tagout procedures, electrical safety testing',
            insurance_required=True,
            white_card_required=True
        )
        db.session.add(job)
        
        db.session.commit()
        
        # Create application
        application = Application(
            job_id=job.id,
            worker_id=worker.id,
            status='accepted',
            proposed_rate=5500,
            cover_letter='Licensed electrician specializing in residential fit-outs.',
            abn_verified=True,
            insurance_verified=True
        )
        db.session.add(application)
        
        db.session.commit()
        
        # Create contract
        contract = Contract(
            job_id=job.id,
            application_id=application.id,
            contractor_id=contractor.id,
            worker_id=worker.id,
            agreed_rate=5500,
            start_date=date.today() + timedelta(days=3),
            expected_completion_date=date.today() + timedelta(days=21),
            terms_and_conditions='Standard ICA template with Fair Work compliance.',
            contractor_signed=True,
            worker_signed=True,
            signature_method='digital',
            superannuation_handled_by_worker=True,
            termination_notice_period=7,
            status='signed'
        )
        db.session.add(contract)
        
        db.session.commit()
        
        # Create payment
        payment = Payment(
            job_id=job.id,
            contract_id=contract.id,
            contractor_id=contractor.id,
            worker_id=worker.id,
            amount=5500,
            platform_commission=550,
            platform_fee_percentage=10.00,
            status='held',
            escrow_release_date=datetime.utcnow() + timedelta(days=25)
        )
        db.session.add(payment)
        
        # Create invoice
        invoice = Invoice(
            job_id=job.id,
            worker_id=worker.id,
            contractor_id=contractor.id,
            invoice_number='INV-2025-001',
            amount=5500,
            gst_amount=550,  # 10% GST
            total_amount=6050,
            description='Electrical fit-out - residential',
            status='pending',
            issued_date=date.today(),
            due_date=date.today() + timedelta(days=7)
        )
        db.session.add(invoice)
        
        db.session.commit()
        
        # Verify counts
        user_count = User.query.count()
        job_count = Job.query.count()
        contract_count = Contract.query.count()
        payment_count = Payment.query.count()
        invoice_count = Invoice.query.count()
        
        print(f"✅ Users created: {user_count}")
        print(f"✅ Jobs created: {job_count}")
        print(f"✅ Contracts created: {contract_count}")
        print(f"✅ Payments created: {payment_count}")
        print(f"✅ Invoices created: {invoice_count}")
        
        # Test legal compliance workflow
        test_contract = Contract.query.first()
        test_payment = Payment.query.first()
        test_invoice = Invoice.query.first()
        
        print(f"✅ Contract status: {test_contract.status}")
        print(f"✅ Contract rate: ${test_contract.agreed_rate}")
        print(f"✅ Payment held in escrow: ${test_payment.amount}")
        print(f"✅ Platform commission: ${test_payment.platform_commission}")
        print(f"✅ Invoice total (inc GST): ${test_invoice.total_amount}")
        
        # Test ABN compliance
        worker_abn = User.query.filter_by(role='worker').first().abn_number
        contractor_abn = User.query.filter_by(role='contractor').first().abn_number
        
        print(f"✅ Worker ABN: {worker_abn}")
        print(f"✅ Contractor ABN: {contractor_abn}")
        print("✅ ABN compliance: No 47% withholding tax risk!")
        
        print("✅ CHUNK 3 completed successfully!")
        print("✅ Legal workflow: Application → Contract → Payment → Invoice")
        print("✅ Australian tax compliance ready!")
        print("📦 Ready for CHUNK 4...")

if __name__ == '__main__':
    test_chunk3()
from database_setup import create_database
from models import db, User, Category, Job, Application, Contract, Payment, Invoice
from datetime import datetime, timedelta, date

def test_chunk3():
    app = create_database()
    
    with app.app_context():
        print("🧪 Testing CHUNK 3: Legal Compliance Models...")
        
        # Clear existing data
        db.drop_all()
        db.create_all()
        
        # Create test users
        contractor = User(
            email='contractor@rateright.com.au',
            first_name='Sarah',
            last_name='Wilson',
            role='contractor',
            phone_number='0412345678',
            location='Melbourne, VIC',
            business_name='Wilson Construction',
            abn_number='12345678901',
            gst_registered=True
        )
        contractor.set_password('password123')
        db.session.add(contractor)
        
        worker = User(
            email='worker@rateright.com.au',
            first_name='David',
            last_name='Chen',
            role='worker',
            phone_number='0423456789',
            location='Melbourne, VIC',
            primary_trade='Electrician',
            abn_number='98765432109',
            gst_registered=True,
            public_liability_insurance='ALLIANZ-PL-2025-001',
            public_liability_amount=20000000.00
        )
        worker.set_password('password123')
        db.session.add(worker)
        
        # Create category and job
        category = Category(
            name='Electrician',
            description='Electrical work and installations',
            whs_risk_level='high',
            insurance_requirements='$20M public liability required'
        )
        db.session.add(category)
        
        db.session.commit()
        
        job = Job(
            title='Main Electrical - New Build',
            description='Complete electrical fit-out for 3-story residential.',
            contractor_id=contractor.id,
            category_id=category.id,
            location='Melbourne, VIC',
            budget_min=4000,
            budget_max=6000,
            whs_requirements='Lockout/tagout procedures, electrical safety testing',
            insurance_required=True,
            white_card_required=True
        )
        db.session.add(job)
        
        db.session.commit()
        
        # Create application
        application = Application(
            job_id=job.id,
            worker_id=worker.id,
            status='accepted',
            proposed_rate=5500,
            cover_letter='Licensed electrician specializing in residential fit-outs.',
            abn_verified=True,
            insurance_verified=True
        )
        db.session.add(application)
        
        db.session.commit()
        
        # Create contract
        contract = Contract(
            job_id=job.id,
            application_id=application.id,
            contractor_id=contractor.id,
            worker_id=worker.id,
            agreed_rate=5500,
            start_date=date.today() + timedelta(days=3),
            expected_completion_date=date.today() + timedelta(days=25),
            terms_and_conditions='Standard ICA template with Fair Work compliance.',
            contractor_signed=True,
            worker_signed=True,
            signature_method='digital',
            superannuation_handled_by_worker=True,
            termination_notice_period=7,
            status='signed'
        )
        db.session.add(contract)
        
        db.session.commit()
        
        # Create payment
        payment = Payment(
            job_id=job.id,
            contract_id=contract.id,
            contractor_id=contractor.id,
            worker_id=worker.id,
            amount=5500,
            platform_commission=550,
            platform_fee_percentage=10.00,
            status='held',
            escrow_release_date=datetime.utcnow() + timedelta(days=25)
        )
        db.session.add(payment)
        
        # Create invoice
        invoice = Invoice(
            job_id=job.id,
            worker_id=worker.id,
            contractor_id=contractor.id,
            invoice_number='INV-2025-001',
            amount=5500,
            gst_amount=550,  # 10% GST
            total_amount=6050,
            description='Electrical fit-out - residential',
            status='pending',
            issued_date=date.today(),
            due_date=date.today() + timedelta(days=7)
        )
        db.session.add(invoice)
        
        db.session.commit()
        
        # Verify counts
        user_count = User.query.count()
        job_count = Job.query.count()
        contract_count = Contract.query.count()
        payment_count = Payment.query.count()
        invoice_count = Invoice.query.count()
        
        print(f"✅ Users created: {user_count}")
        print(f"✅ Jobs created: {job_count}")
        print(f"✅ Contracts created: {contract_count}")
        print(f"✅ Payments created: {payment_count}")
        print(f"✅ Invoices created: {invoice_count}")
        
        # Test business logic
        print(f"✅ Contract status: {contract.status}")
        print(f"✅ Contract rate: ${contract.agreed_rate}")
        print(f"✅ Payment held in escrow: ${payment.amount}")
        print(f"✅ Platform commission: ${payment.platform_commission}")
        print(f"✅ Invoice total (inc GST): ${invoice.total_amount}")
        print(f"✅ Worker ABN: {worker.abn_number}")
        print(f"✅ Contractor ABN: {contractor.abn_number}")
        print("✅ ABN compliance: No 47% withholding tax risk!")
        print("✅ CHUNK 3 completed successfully!")
        print("✅ Legal workflow: Application → Contract → Payment → Invoice")
        print("✅ Australian tax compliance ready!")
        print("📦 Ready for CHUNK 4...")

if __name__ == '__main__':
    test_chunk3()
"""
TEST CHUNK 3: Marketplace Models + Authentication Blueprint
Tests Job, Application models and auth/marketplace routes
"""

def test_chunk3():
    print("Testing Chunk 3: Marketplace Models + Authentication")
    
    try:
        # Test imports
        from app import create_app
        from app.extensions import db
        from app.models import User, Category, Job, Application
        print("✅ All imports successful")
        
        # Create app and context
        app = create_app()
        
        with app.app_context():
            # Create tables
            db.create_all()
            print("✅ Database tables created")
            
            # Test User creation
            contractor = User(
                email='john.contractor@gmail.com',
                first_name='John',
                last_name='Builder',
                role='contractor',
                phone_number='0412345678',
                location='Sydney, NSW',
                business_name='Builder Co Pty Ltd',
                primary_trade='General Building',
                abn_number='12345678901',
                gst_registered=True,
                privacy_consent=True,
                terms_accepted=True
            )
            contractor.set_password('password123')
            db.session.add(contractor)
            
            worker = User(
                email='sarah.worker@gmail.com',
                first_name='Sarah',
                last_name='Electrician',
                role='worker',
                phone_number='0487654321',
                location='Melbourne, VIC',
                business_name='Sarah Electrical Services',
                primary_trade='Electrical',
                abn_number='98765432109',
                gst_registered=False,
                public_liability_insurance=True,
                public_liability_amount=2000000,
                privacy_consent=True,
                terms_accepted=True
            )
            worker.set_password('password456')
            db.session.add(worker)
            
            db.session.commit()
            print("✅ Users created (contractor and worker)")
            
            # Test Category creation
            category = Category(
                name='Electrical',
                description='Electrical work including wiring, installations, and repairs',
                whs_risk_level='high',
                insurance_requirements='$2M public liability required',
                license_required=True,
                white_card_required=True
            )
            db.session.add(category)
            db.session.commit()
            print("✅ Category created")
            
            # Test Job creation
            job = Job(
                title='Electrical Installation - New Build',
                description='Complete electrical fit-out for 3-story residential building.',
                contractor_id=contractor.id,
                category_id=category.id,
                location='Melbourne, VIC',
                budget_min=4000,
                budget_max=6000,
                whs_requirements='Lockout/tagout procedures, electrical safety testing required',
                insurance_required=True,
                white_card_required=True
            )
            db.session.add(job)
            db.session.commit()
            print("✅ Job created")
            
            # Test Application creation
            application = Application(
                job_id=job.id,
                worker_id=worker.id,
                proposed_rate=5500,
                cover_letter='Licensed electrician with 10 years experience in residential work.',
                abn_verified=True,
                insurance_verified=True
            )
            db.session.add(application)
            job.applications_count += 1
            db.session.commit()
            print("✅ Application created")
            
            # Test relationships
            assert len(job.applications) == 1
            assert job.applications[0].worker.email == 'sarah.worker@gmail.com'
            assert application.job.title == 'Electrical Installation - New Build'
            print("✅ Model relationships working")
            
            # Test compliance validation
            compliance_valid, issues = worker.is_compliance_valid()
            print(f"✅ Worker compliance check: {compliance_valid} (issues: {len(issues)})")
            
            # Test category insurance minimum
            insurance_min = category.get_insurance_minimum()
            print(f"✅ Category insurance minimum: ${insurance_min:,}")
            
            # Test user gamification
            worker.total_points = 1250
            level = worker.get_gamification_level()
            points_needed = worker.points_to_next_level()
            print(f"✅ Gamification: Level {level}, {points_needed} points to next level")
            
            print("\n🎉 CHUNK 3 COMPLETE!")
            print("✅ Job and Application models working")
            print("✅ User authentication models ready")
            print("✅ Australian compliance validation working")
            print("✅ Model relationships established")
            print("✅ Ready for authentication blueprint testing")
            print("\n📦 Ready for CHUNK 4: Legal & Safety models...")
            
    except Exception as e:
        print(f"❌ Error: {e}")
        import traceback
        traceback.print_exc()
        return False
    
    return True

if __name__ == '__main__':
    test_chunk3()
