#!/usr/bin/env python3
"""
Project Validation Script

Project: Music Classification Dataset
Author: Molla Samser
Company: RSK World
Website: https://rskworld.in
Email: help@rskworld.in
Description: Validates all project files and structure
"""

import os
import sys

def print_header():
    print("="*70)
    print("  PROJECT VALIDATION - Music Classification Dataset")
    print("  Author: Molla Samser | RSK World")
    print("="*70)
    print()

def check_file_exists(filepath, description):
    """Check if a file exists"""
    if os.path.exists(filepath):
        print(f"  [OK] {description}")
        return True
    else:
        print(f"  [MISSING] {description}: {filepath}")
        return False

def check_directory_exists(dirpath, description):
    """Check if a directory exists"""
    if os.path.isdir(dirpath):
        print(f"  [OK] {description}")
        return True
    else:
        print(f"  [MISSING] {description}: {dirpath}")
        return False

def validate_python_syntax(filepath):
    """Validate Python file syntax"""
    try:
        with open(filepath, 'r', encoding='utf-8') as f:
            code = f.read()
        compile(code, filepath, 'exec')
        return True
    except SyntaxError as e:
        print(f"  [SYNTAX ERROR] {filepath}: {e}")
        return False
    except Exception as e:
        print(f"  [ERROR] {filepath}: {e}")
        return False

def main():
    print_header()
    
    all_passed = True
    errors = []
    
    # Check directories
    print("[1/6] Checking directories...")
    directories = [
        ('data', 'Data directory'),
        ('data/audio', 'Audio directory'),
        ('data/audio/classical', 'Classical genre'),
        ('data/audio/jazz', 'Jazz genre'),
        ('data/audio/rock', 'Rock genre'),
        ('data/audio/pop', 'Pop genre'),
        ('data/audio/hiphop', 'Hip-hop genre'),
        ('data/audio/electronic', 'Electronic genre'),
        ('data/audio/country', 'Country genre'),
        ('data/audio/blues', 'Blues genre'),
        ('models', 'Models directory'),
        ('models/saved_models', 'Saved models directory'),
        ('utils', 'Utils directory'),
        ('notebooks', 'Notebooks directory'),
    ]
    
    for dirpath, desc in directories:
        if not check_directory_exists(dirpath, desc):
            all_passed = False
            errors.append(f"Missing directory: {dirpath}")
    print()
    
    # Check data files
    print("[2/6] Checking data files...")
    data_files = [
        ('data/train_data.csv', 'Training data CSV'),
        ('data/test_data.csv', 'Test data CSV'),
        ('data/features.csv', 'Features CSV'),
        ('data/README.md', 'Data README'),
    ]
    
    for filepath, desc in data_files:
        if not check_file_exists(filepath, desc):
            all_passed = False
            errors.append(f"Missing file: {filepath}")
    print()
    
    # Check Python modules
    print("[3/6] Checking Python modules...")
    python_files = [
        ('config.py', 'Configuration'),
        ('quick_start.py', 'Quick start script'),
        ('demo.py', 'Demo script'),
        ('example_usage.py', 'Example usage'),
        ('setup.py', 'Setup script'),
        ('utils/__init__.py', 'Utils init'),
        ('utils/audio_processor.py', 'Audio processor'),
        ('utils/feature_extractor.py', 'Feature extractor'),
        ('utils/audio_augmentation.py', 'Audio augmentation'),
        ('utils/advanced_features.py', 'Advanced features'),
        ('utils/model_comparison.py', 'Model comparison'),
        ('utils/realtime_processor.py', 'Realtime processor'),
        ('models/__init__.py', 'Models init'),
        ('models/train_model.py', 'Train model'),
        ('models/predict.py', 'Predict script'),
        ('models/neural_network_model.py', 'Neural network model'),
    ]
    
    for filepath, desc in python_files:
        if check_file_exists(filepath, desc):
            if not validate_python_syntax(filepath):
                all_passed = False
                errors.append(f"Syntax error in: {filepath}")
        else:
            all_passed = False
            errors.append(f"Missing file: {filepath}")
    print()
    
    # Check documentation
    print("[4/6] Checking documentation...")
    doc_files = [
        ('README.md', 'Main README'),
        ('LICENSE', 'License file'),
        ('requirements.txt', 'Requirements'),
        ('INSTALLATION.md', 'Installation guide'),
        ('USAGE_GUIDE.md', 'Usage guide'),
        ('DATASET_INFO.md', 'Dataset info'),
        ('ADVANCED_FEATURES.md', 'Advanced features guide'),
        ('PROJECT_STRUCTURE.md', 'Project structure'),
        ('PROJECT_SUMMARY.md', 'Project summary'),
        ('WHATS_NEW.md', 'What is new'),
        ('CONTRIBUTING.md', 'Contributing guide'),
        ('START_HERE.md', 'Start here guide'),
        ('COMPLETE_PROJECT_INFO.txt', 'Complete project info'),
    ]
    
    for filepath, desc in doc_files:
        if not check_file_exists(filepath, desc):
            all_passed = False
            errors.append(f"Missing file: {filepath}")
    print()
    
    # Check other files
    print("[5/6] Checking other files...")
    other_files = [
        ('index.html', 'Demo webpage'),
        ('.gitignore', 'Git ignore'),
        ('notebooks/exploratory_analysis.ipynb', 'Exploratory notebook'),
        ('notebooks/audio_visualization.ipynb', 'Visualization notebook'),
    ]
    
    for filepath, desc in other_files:
        if not check_file_exists(filepath, desc):
            all_passed = False
            errors.append(f"Missing file: {filepath}")
    print()
    
    # Count statistics
    print("[6/6] Project Statistics...")
    
    # Count files
    py_count = sum(1 for f in python_files if os.path.exists(f[0]))
    doc_count = sum(1 for f in doc_files if os.path.exists(f[0]))
    
    # Count lines in data files
    try:
        import pandas as pd
        train_df = pd.read_csv('data/train_data.csv')
        test_df = pd.read_csv('data/test_data.csv')
        features_df = pd.read_csv('data/features.csv')
        print(f"  Training samples: {len(train_df)}")
        print(f"  Test samples: {len(test_df)}")
        print(f"  Feature samples: {len(features_df)}")
    except:
        pass
    
    print(f"  Python files: {py_count}")
    print(f"  Documentation files: {doc_count}")
    print()
    
    # Summary
    print("="*70)
    print("VALIDATION SUMMARY")
    print("="*70)
    
    if all_passed:
        print("  [SUCCESS] All checks passed!")
        print("  Project is complete and ready to use.")
    else:
        print("  [WARNING] Some checks failed:")
        for error in errors:
            print(f"    - {error}")
    
    print()
    print("  (c) 2026 RSK World - Molla Samser")
    print("  https://rskworld.in")
    print("="*70)
    
    return 0 if all_passed else 1


if __name__ == "__main__":
    sys.exit(main())

