"""
Verify All Business Keys Configuration

This script verifies that all business keys in the configuration
actually exist in the corresponding MongoDB collections.
"""

from services.mongo import MongoService
from services.json_flattener import JSONFlattener
from services.settings_service import SettingsService
import json

def verify_all_business_keys():
    """Verify business keys for all collections."""
    print("=" * 80)
    print("Business Keys Configuration Verification")
    print("=" * 80)
    
    # Initialize services
    print("\n1. Initializing services...")
    settings_service = SettingsService()
    config = settings_service.config
    
    mongo_service = MongoService()
    if not mongo_service.connect():
        print("❌ Failed to connect to MongoDB")
        return False
    
    print("✅ Services initialized")
    
    # Get all collections
    collections_config = config['collections']
    flattener = JSONFlattener()
    
    print(f"\n2. Checking {len(collections_config)} collections...")
    
    issues_found = []
    collections_checked = 0
    
    for collection_name, coll_config in collections_config.items():
        # Skip if not enabled
        if not coll_config.get('enabled', True):
            continue
        
        # Get business keys
        business_keys = coll_config.get('business_keys', [])
        alternative_keys = coll_config.get('alternative_keys', [])
        
        if not business_keys and not alternative_keys:
            continue
        
        # Check if collection has data
        collection = mongo_service.get_collection(collection_name)
        if collection is None:
            continue
        
        count = collection.count_documents({})
        if count == 0:
            print(f"\n   ⚪ {collection_name}: Empty (skipping)")
            continue
        
        collections_checked += 1
        print(f"\n   🔍 {collection_name} ({count} documents)")
        
        # Get sample document
        doc = collection.find_one()
        flat_doc = flattener.flatten(doc)
        
        # Check business keys
        missing_business_keys = []
        for key in business_keys:
            if key not in flat_doc:
                missing_business_keys.append(key)
        
        # Check alternative keys
        missing_alternative_keys = []
        for key in alternative_keys:
            if key not in flat_doc:
                missing_alternative_keys.append(key)
        
        # Report results
        if missing_business_keys or missing_alternative_keys:
            print(f"      ❌ ISSUES FOUND:")
            
            if missing_business_keys:
                print(f"         Missing business keys: {', '.join(missing_business_keys)}")
                issues_found.append({
                    'collection': collection_name,
                    'type': 'business_keys',
                    'missing': missing_business_keys
                })
            
            if missing_alternative_keys:
                print(f"         Missing alternative keys: {', '.join(missing_alternative_keys)}")
                issues_found.append({
                    'collection': collection_name,
                    'type': 'alternative_keys',
                    'missing': missing_alternative_keys
                })
            
            # Show available fields with similar names
            print(f"      💡 Available fields containing 'code':")
            code_fields = [k for k in sorted(flat_doc.keys()) if 'code' in k.lower()]
            for field in code_fields[:5]:
                print(f"         - {field}")
        else:
            print(f"      ✅ All keys exist")
    
    # Summary
    print("\n" + "=" * 80)
    print("SUMMARY")
    print("=" * 80)
    
    print(f"\n   Collections checked: {collections_checked}")
    
    if issues_found:
        print(f"   ❌ Issues found in {len(set(i['collection'] for i in issues_found))} collections")
        
        print("\n   Collections with issues:")
        for issue in issues_found:
            print(f"      - {issue['collection']}: {issue['type']} - {', '.join(issue['missing'])}")
    else:
        print(f"   ✅ All business keys are valid!")
    
    print("\n" + "=" * 80)
    
    return len(issues_found) == 0

if __name__ == "__main__":
    try:
        success = verify_all_business_keys()
        exit(0 if success else 1)
    except Exception as e:
        print(f"\n❌ Error: {e}")
        import traceback
        traceback.print_exc()
        exit(1)
