#!/usr/bin/env python3 """ Master orchestrator for Saudi healthcare data generation. Runs all data generators in the correct dependency order. """ import os import sys import argparse from datetime import datetime # Add current directory to path for imports sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from data_utils.base import DataGenerationOrchestrator from data_utils.helpers import validate_dependencies def create_orchestrator(): """Create and configure the data generation orchestrator""" orchestrator = DataGenerationOrchestrator() # Import and register all generators try: from core_data import SaudiCoreDataGenerator orchestrator.register_generator('core', SaudiCoreDataGenerator) except ImportError: print("Warning: core_data.py not found or not refactored yet") try: from accounts_data import SaudiAccountsDataGenerator orchestrator.register_generator('accounts', SaudiAccountsDataGenerator) except ImportError: print("Warning: accounts_data.py not found or not refactored yet") try: from hr_data import SaudiHRDataGenerator orchestrator.register_generator('hr', SaudiHRDataGenerator) except ImportError: print("Warning: hr_data.py not found or not refactored yet") try: from patients_data import SaudiPatientsDataGenerator orchestrator.register_generator('patients', SaudiPatientsDataGenerator) except ImportError: print("Warning: patients_data.py not found or not refactored yet") try: from emr_data import SaudiEMRDataGenerator orchestrator.register_generator('emr', SaudiEMRDataGenerator) except ImportError: print("Warning: emr_data.py not found or not refactored yet") try: from lab_data import SaudiLabDataGenerator orchestrator.register_generator('lab', SaudiLabDataGenerator) except ImportError: print("Warning: lab_data.py not found or not refactored yet") try: from radiology_data import SaudiRadiologyDataGenerator orchestrator.register_generator('radiology', SaudiRadiologyDataGenerator) except ImportError: print("Warning: radiology_data.py not found or not refactored yet") try: from pharmacy_data import SaudiPharmacyDataGenerator orchestrator.register_generator('pharmacy', SaudiPharmacyDataGenerator) except ImportError: print("Warning: pharmacy_data.py not found or not refactored yet") try: from appointments_data import SaudiAppointmentsDataGenerator orchestrator.register_generator('appointments', SaudiAppointmentsDataGenerator) except ImportError: print("Warning: appointments_data.py not found or not refactored yet") try: from billing_data import SaudiBillingDataGenerator orchestrator.register_generator('billing', SaudiBillingDataGenerator) except ImportError: print("Warning: billing_data.py not found or not refactored yet") try: from inpatients_data import SaudiInpatientsDataGenerator orchestrator.register_generator('inpatients', SaudiInpatientsDataGenerator) except ImportError: print("Warning: inpatients_data.py not found or not refactored yet") try: from inventory_data import SaudiInventoryDataGenerator orchestrator.register_generator('inventory', SaudiInventoryDataGenerator) except ImportError: print("Warning: inventory_data.py not found or not refactored yet") # Facility management uses management command try: from facility_management.management.commands.seed_facility import Command as FacilityCommand orchestrator.register_generator('facility_management', FacilityCommand) except ImportError: print("Warning: facility_management command not available") return orchestrator def main(): """Main function to run data generation""" parser = argparse.ArgumentParser(description='Generate Saudi healthcare test data') parser.add_argument('--generators', nargs='*', help='Specific generators to run (default: all in dependency order)') parser.add_argument('--list-generators', action='store_true', help='List available generators and exit') parser.add_argument('--show-plan', action='store_true', help='Show execution plan and exit') parser.add_argument('--validate-only', action='store_true', help='Validate dependencies and exit') parser.add_argument('--tenant-id', type=int, help='Tenant ID to generate data for (default: all active tenants)') parser.add_argument('--tenant-slug', type=str, help='Tenant slug to generate data for') parser.add_argument('--skip-validation', action='store_true', help='Skip dependency validation') args = parser.parse_args() print("šŸ„ Saudi Healthcare Data Generation Orchestrator") print("=" * 55) # Create orchestrator orchestrator = create_orchestrator() # List generators if requested if args.list_generators: print("\nšŸ“‹ Available Generators:") for gen in orchestrator.get_available_generators(): print(f" - {gen}") return # Show execution plan if requested if args.show_plan: generators_to_run = args.generators or orchestrator.execution_order plan = orchestrator.get_execution_plan(generators_to_run) print("\nšŸ“‹ Execution Plan:") for item in plan: deps = ', '.join(item['dependencies']) if item['dependencies'] else 'None' print(f" {item['name']} ({item['class']})") print(f" Dependencies: {deps}") return # Validate dependencies if not args.skip_validation: try: deps = validate_dependencies() print(f"āœ… Dependencies validated: {deps['tenants']} tenants, {deps['users']} users") except ValueError as e: print(f"āŒ Dependency validation failed: {e}") return # Validate only if requested if args.validate_only: print("āœ… Validation complete - all dependencies satisfied") return # Determine generators to run generators_to_run = args.generators or orchestrator.execution_order # Prepare kwargs for generators generator_kwargs = {} if args.tenant_id: generator_kwargs['tenant_id'] = args.tenant_id if args.tenant_slug: generator_kwargs['tenant_slug'] = args.tenant_slug # Run generators start_time = datetime.now() print(f"\nšŸš€ Starting data generation at {start_time}") print(f"šŸ“¦ Generators to run: {', '.join(generators_to_run)}") results = orchestrator.run_all(generators_to_run, **generator_kwargs) # Print summary end_time = datetime.now() duration = end_time - start_time print(f"\nšŸŽ‰ Data generation completed at {end_time}") print(f"ā±ļø Total duration: {duration}") if results: print(f"\nšŸ“Š Generation Summary:") total_created = 0 for generator_name, result in results.items(): if isinstance(result, dict): count = sum(result.values()) if all(isinstance(v, int) for v in result.values()) else len(result) print(f" {generator_name}: {count} records") total_created += count else: print(f" {generator_name}: {result}") print(f"\nšŸ’” Total records created: {total_created}") else: print("\nāš ļø No data was generated") print("\nāœ… Saudi healthcare data generation orchestrator completed successfully!") if __name__ == "__main__": main()