"""
Browser-based End-to-End Contract Workflow Test
Tests the complete lifecycle through the actual running application
"""

import time
import requests
from datetime import datetime, timezone, timedelta
import logging

# Set up logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

class BrowserE2EWorkflowTest:
    """Browser-based end-to-end workflow test"""
    
    def __init__(self):
        self.base_url = "http://localhost:5000"
        self.workflow_report = []
        self.issues_found = []
        self.fixes_applied = []
    
    def test_complete_workflow(self):
        """Test the complete contract workflow through the browser"""
        
        try:
            # Step 1: Test if the application is running
            logger.info("\n=== STEP 1: APPLICATION HEALTH CHECK ===")
            try:
                response = requests.get(f"{self.base_url}/")
                if response.status_code == 200:
                    self.workflow_report.append("✓ Application is running")
                else:
                    self.issues_found.append(f"Application not responding correctly: {response.status_code}")
            except requests.exceptions.ConnectionError:
                self.issues_found.append("Application is not running on http://localhost:5000")
                return
            
            # Step 2: Check if registration page is accessible
            logger.info("\n=== STEP 2: REGISTRATION PAGE CHECK ===")
            response = requests.get(f"{self.base_url}/auth/register")
            if response.status_code == 200:
                self.workflow_report.append("✓ Registration page accessible")
            else:
                self.issues_found.append(f"Registration page not accessible: {response.status_code}")
            
            # Step 3: Register contractor
            logger.info("\n=== STEP 3: CONTRACTOR REGISTRATION ===")
            contractor_data = {
                'name': 'Test Contractor',
                'email': 'contractor_test@example.com',
                'password': 'TestPass123!',
                'confirm_password': 'TestPass123!',
                'abn': '12345678901',
                'role': 'contractor',
                'phone': '0412345678',
                'business_name': 'Test Construction Co'
            }
            
            session = requests.Session()
            response = session.post(f"{self.base_url}/auth/register", data=contractor_data)
            if response.status_code in [200, 302]:
                self.workflow_report.append("✓ Contractor registered")
            else:
                self.issues_found.append(f"Contractor registration failed: {response.status_code}")
            
            # Step 4: Register worker
            logger.info("\n=== STEP 4: WORKER REGISTRATION ===")
            worker_data = {
                'name': 'Test Worker',
                'email': 'worker_test@example.com',
                'password': 'TestPass123!',
                'confirm_password': 'TestPass123!',
                'abn': '98765432109',
                'role': 'worker',
                'phone': '0498765432'
            }
            
            session2 = requests.Session()
            response = session2.post(f"{self.base_url}/auth/register", data=worker_data)
            if response.status_code in [200, 302]:
                self.workflow_report.append("✓ Worker registered")
            else:
                self.issues_found.append(f"Worker registration failed: {response.status_code}")
            
            # Step 5: Login as contractor
            logger.info("\n=== STEP 5: CONTRACTOR LOGIN ===")
            login_data = {
                'email': 'contractor_test@example.com',
                'password': 'TestPass123!'
            }
            
            response = session.post(f"{self.base_url}/auth/login", data=login_data)
            if response.status_code in [200, 302]:
                self.workflow_report.append("✓ Contractor logged in")
            else:
                self.issues_found.append(f"Contractor login failed: {response.status_code}")
            
            # Step 6: Check dashboard
            logger.info("\n=== STEP 6: DASHBOARD CHECK ===")
            response = session.get(f"{self.base_url}/dashboard")
            if response.status_code == 200:
                self.workflow_report.append("✓ Dashboard accessible")
            else:
                self.issues_found.append(f"Dashboard not accessible: {response.status_code}")
            
            # Step 7: Post a job
            logger.info("\n=== STEP 7: JOB POSTING ===")
            job_data = {
                'title': 'Test Kitchen Renovation',
                'category_id': 2,
                'location': 'Sydney, NSW',
                'hourly_rate': 50.00,
                'estimated_hours': 40,
                'workers_needed': 1,
                'description': 'Complete kitchen renovation including cabinets and countertops',
                'safety_requirements': 'White Card Required, Insurance Required'
            }
            
            response = session.post(f"{self.base_url}/jobs/post", data=job_data)
            if response.status_code in [200, 302]:
                self.workflow_report.append("✓ Job posted successfully")
            else:
                self.issues_found.append(f"Job posting failed: {response.status_code}")
            
            # Step 8: Logout contractor and login as worker
            logger.info("\n=== STEP 8: SWITCH TO WORKER ===")
            session.get(f"{self.base_url}/auth/logout")
            
            worker_login = {
                'email': 'worker_test@example.com',
                'password': 'TestPass123!'
            }
            
            response = session2.post(f"{self.base_url}/auth/login", data=worker_login)
            if response.status_code in [200, 302]:
                self.workflow_report.append("✓ Worker logged in")
            else:
                self.issues_found.append(f"Worker login failed: {response.status_code}")
            
            # Step 9: Check available jobs
            logger.info("\n=== STEP 9: CHECK AVAILABLE JOBS ===")
            response = session2.get(f"{self.base_url}/jobs")
            if response.status_code == 200:
                self.workflow_report.append("✓ Jobs page accessible")
                if 'Test Kitchen Renovation' in response.text:
                    self.workflow_report.append("✓ Posted job visible")
                else:
                    self.issues_found.append("Posted job not visible in jobs list")
            else:
                self.issues_found.append(f"Jobs page not accessible: {response.status_code}")
            
            # Generate report for basic workflow
            self.generate_report()
            
        except Exception as e:
            self.issues_found.append(f"Unexpected error: {str(e)}")
            logger.error(f"Error during workflow: {e}", exc_info=True)
            self.generate_report()
    
    def generate_report(self):
        """Generate the final report"""
        logger.info("\n" + "="*60)
        logger.info("BROWSER E2E WORKFLOW TEST REPORT")
        logger.info("="*60)
        
        logger.info(f"\nTest URL: {self.base_url}")
        logger.info(f"Timestamp: {datetime.now(timezone.utc).isoformat()}")
        
        logger.info("\n✅ SUCCESSFUL STEPS:")
        if self.workflow_report:
            for item in self.workflow_report:
                logger.info(f"  {item}")
        else:
            logger.info("  No successful steps")
        
        if self.issues_found:
            logger.info("\n❌ ISSUES FOUND:")
            for issue in self.issues_found:
                logger.info(f"  - {issue}")
        else:
            logger.info("\n🎉 ALL STEPS COMPLETED SUCCESSFULLY!")
        
        logger.info("\n" + "="*60)
        logger.info(f"Summary: {len(self.workflow_report)} succeeded, {len(self.issues_found)} failed")
        logger.info("="*60)
        
        return len(self.issues_found) == 0

if __name__ == "__main__":
    test = BrowserE2EWorkflowTest()
    success = test.test_complete_workflow()
    exit(0 if success else 1)
