#!/usr/bin/env python3
"""
Script de nettoyage et organisation du projet Web Sentinel
Analyse, classe et supprime les fichiers obsolètes
"""

import os
import shutil
import sys
from pathlib import Path
import json
from datetime import datetime

class ProjectCleaner:
    """Nettoyeur et organisateur de projet."""
    
    def __init__(self, project_root: str):
        self.project_root = Path(project_root)
        self.archive_dir = self.project_root / "archive_tests"
        self.scripts_dir = self.project_root / "scripts_utilitaires"
        
        # Configuration des actions
        self.to_archive = []  # Fichiers à archiver
        self.to_keep = []     # Fichiers à conserver
        self.to_delete = []   # Fichiers à supprimer
        self.to_organize = [] # Fichiers à réorganiser
        
    def analyze_files(self):
        """Analyser tous les fichiers du projet."""
        print("🔍 Analyse des fichiers du projet...")
        
        # Fichiers de test obsolètes ou redondants
        obsolete_tests = [
            "check_accounts.py",           # Obsolète - remplacé par système de licence moderne
            "check_bruno_account.py",      # Test spécifique obsolète
            "ci_test.py",                  # Test CI basique obsolète
            "create_test_accounts.py",     # Obsolète - système d'auth moderne
            "create_test_subscriptions.py", # Obsolète - gestion subscription moderne
            "demo_gui_sast.py",            # Remplacé par demo_interface_moderne.py
            "demo_nouvelles_limites_complete.py", # Test temporaire obsolète
            "demo_sast_complete.py",       # Remplacé par interface moderne
            "test_accounts_manager.py",    # Obsolète
            "test_all_tiers.py",           # Redondant avec tests/ modernes
            "test_corrections.py",         # Test temporaire
            "test_critiques.py",           # Test temporaire
            "test_degrisage_sast.py",      # Problème résolu dans interface moderne
            "test_direct.py",              # Test basique obsolète
            "test_gui_onglets.py",         # Remplacé par interface moderne
            "test_gui_sast_simple.py",     # Remplacé par interface moderne
            "test_invasive_modal.py",      # Fonctionnalité intégrée
            "test_local_sources.py",       # Test temporaire
            "test_modules_local.py",       # Test temporaire
            "test_nouvelles_limites_sast.py", # Test temporaire
            "test_real_security.py",       # Test obsolète
            "test_runtime_bridge.py",      # Fonctionnalité intégrée
            "test_sast_demo.py",           # Remplacé par interface moderne
            "upgrade_bruno_to_sysop.py",   # Script spécifique obsolète
            "verify_tiers.py",             # Redondant
        ]
        
        # Scripts utilitaires à conserver mais organiser
        utility_scripts = [
            "build_exe.py",                # Script de compilation
            "generer_licence_test.py",     # Utilitaire de licence
            "fix_i18n.py",                 # Script de correction
            "install.py",                  # Script d'installation
            "quick_start.py",              # Démarrage rapide
            "run_tests.py",                # Lanceur de tests
            "run_tests_pytest.py",         # Tests pytest
            "validate_deployment.py",      # Validation déploiement
        ]
        
        # Fichiers de validation récents à conserver
        validation_files = [
            "validation_finale_interface.py",  # Validation interface
            "validation_finale_moderne.py",    # Validation moderne
            "validation_finale_sast.py",       # Validation SAST
            "validation_interface_moderne.py", # Validation interface moderne
            "demo_interface_moderne.py",       # Démo moderne fonctionnelle
        ]
        
        # Documents à conserver
        keep_docs = [
            "README.md",
            "LICENSE",
            "requirements.txt",
            "requirements-dev.txt",
            "pytest.ini",
            "SAST-SPECIFICATION.md",
            "GUIDE-DEPLOIEMENT-OVH.md",
            ".gitignore",
            "docker-compose.yml",
        ]
        
        # Fichiers temporaires à supprimer
        temp_files = [
            "lancement.py",                # Script temporaire
            "gui_entry.py",                # Point d'entrée obsolète
            "launch_web_sentinel.bat",     # Script batch obsolète
            "run_tests_pytest.bat",        # Batch obsolète
            "csrf_protection_example.php", # Exemple obsolète
            "license.lic",                 # Fichier de licence temporaire
            ".coverage",                   # Fichier de couverture temporaire
            "WebSentinel.spec",            # Spec PyInstaller temporaire
        ]
        
        # Documents de session obsolètes
        session_docs = [
            "ANALYSE_CHANGEMENTS_RECENT.md",
            "DEPANNAGE-URGENT.md",
            "IMAGES-FIX.md",
            "logs.md",
            "prompt.md",
            "resumer_16_10_2025.md",
            "SESSION_ANALYSE_FINAL.md",
        ]
        
        # Classification des fichiers
        self.to_delete = temp_files
        self.to_archive = obsolete_tests + session_docs
        self.to_organize = utility_scripts
        self.to_keep = validation_files + keep_docs
        
        print(f"  📁 À archiver: {len(self.to_archive)} fichiers")
        print(f"  🗑️  À supprimer: {len(self.to_delete)} fichiers")
        print(f"  📋 À organiser: {len(self.to_organize)} fichiers")
        print(f"  ✅ À conserver: {len(self.to_keep)} fichiers")
        
    def create_directories(self):
        """Créer les dossiers d'organisation."""
        self.archive_dir.mkdir(exist_ok=True)
        self.scripts_dir.mkdir(exist_ok=True)
        
        # Sous-dossiers d'archive
        (self.archive_dir / "tests_obsoletes").mkdir(exist_ok=True)
        (self.archive_dir / "docs_session").mkdir(exist_ok=True)
        (self.archive_dir / "scripts_temporaires").mkdir(exist_ok=True)
        
    def archive_files(self):
        """Archiver les fichiers obsolètes."""
        print("\n📦 Archivage des fichiers obsolètes...")
        
        for filename in self.to_archive:
            file_path = self.project_root / filename
            if file_path.exists():
                if filename.endswith('.py') and 'test' in filename:
                    dest = self.archive_dir / "tests_obsoletes" / filename
                elif filename.endswith('.md'):
                    dest = self.archive_dir / "docs_session" / filename
                else:
                    dest = self.archive_dir / "scripts_temporaires" / filename
                
                try:
                    shutil.move(str(file_path), str(dest))
                    print(f"  📦 Archivé: {filename}")
                except Exception as e:
                    print(f"  ❌ Erreur archivage {filename}: {e}")
    
    def organize_utilities(self):
        """Organiser les scripts utilitaires."""
        print("\n📋 Organisation des scripts utilitaires...")
        
        for filename in self.to_organize:
            file_path = self.project_root / filename
            if file_path.exists():
                dest = self.scripts_dir / filename
                try:
                    shutil.move(str(file_path), str(dest))
                    print(f"  📋 Organisé: {filename}")
                except Exception as e:
                    print(f"  ❌ Erreur organisation {filename}: {e}")
    
    def delete_temp_files(self):
        """Supprimer les fichiers temporaires."""
        print("\n🗑️ Suppression des fichiers temporaires...")
        
        for filename in self.to_delete:
            file_path = self.project_root / filename
            if file_path.exists():
                try:
                    file_path.unlink()
                    print(f"  🗑️ Supprimé: {filename}")
                except Exception as e:
                    print(f"  ❌ Erreur suppression {filename}: {e}")
    
    def clean_build_artifacts(self):
        """Nettoyer les artéfacts de build."""
        print("\n🧹 Nettoyage des artéfacts de build...")
        
        build_dirs = ["build", "__pycache__", ".pytest_cache"]
        for dir_name in build_dirs:
            dir_path = self.project_root / dir_name
            if dir_path.exists() and dir_path.is_dir():
                try:
                    shutil.rmtree(str(dir_path))
                    print(f"  🧹 Nettoyé: {dir_name}/")
                except Exception as e:
                    print(f"  ❌ Erreur nettoyage {dir_name}: {e}")
        
        # Nettoyer les __pycache__ dans web_sentinel/
        for pycache in self.project_root.rglob("__pycache__"):
            if pycache.is_dir():
                try:
                    shutil.rmtree(str(pycache))
                    print(f"  🧹 Nettoyé: {pycache.relative_to(self.project_root)}")
                except Exception as e:
                    print(f"  ❌ Erreur nettoyage {pycache}: {e}")
    
    def create_readme_files(self):
        """Créer des fichiers README pour les dossiers d'organisation."""
        print("\n📝 Création des fichiers README...")
        
        # README pour archive_tests
        archive_readme = self.archive_dir / "README.md"
        archive_content = """# Archive des Tests Obsolètes

Ce dossier contient les fichiers de test et scripts obsolètes du projet Web Sentinel.

## Structure

- `tests_obsoletes/` - Tests Python obsolètes ou remplacés
- `docs_session/` - Documents de session temporaires
- `scripts_temporaires/` - Scripts temporaires non maintenus

## Raison de l'archivage

Ces fichiers ont été archivés car :
- Remplacés par des versions plus modernes
- Fonctionnalités intégrées dans l'interface principale
- Tests temporaires pour des problèmes résolus
- Documentation de session obsolète

Date d'archivage : """ + datetime.now().strftime("%d/%m/%Y")
        
        with open(archive_readme, 'w', encoding='utf-8') as f:
            f.write(archive_content)
        
        # README pour scripts_utilitaires
        scripts_readme = self.scripts_dir / "README.md"
        scripts_content = """# Scripts Utilitaires

Ce dossier contient les scripts utilitaires du projet Web Sentinel.

## Scripts disponibles

- `build_exe.py` - Compilation de l'application en .exe
- `install.py` - Script d'installation du projet
- `quick_start.py` - Démarrage rapide pour développeurs
- `run_tests.py` - Lanceur de tests
- `validate_deployment.py` - Validation du déploiement

## Usage

Ces scripts sont utilisés pour la maintenance, le build et les tests du projet.
Ils ne font pas partie du code principal de l'application.

Date d'organisation : """ + datetime.now().strftime("%d/%m/%Y")
        
        with open(scripts_readme, 'w', encoding='utf-8') as f:
            f.write(scripts_content)
        
        print("  📝 README créés pour les dossiers d'organisation")
    
    def create_cleanup_report(self):
        """Créer un rapport de nettoyage."""
        report_file = self.project_root / "CLEANUP_REPORT.md"
        
        report_content = f"""# Rapport de Nettoyage du Projet Web Sentinel

Date : {datetime.now().strftime("%d/%m/%Y à %H:%M")}

## Actions Effectuées

### 📦 Fichiers Archivés ({len(self.to_archive)})
{chr(10).join(f"- {f}" for f in self.to_archive)}

### 🗑️ Fichiers Supprimés ({len(self.to_delete)})
{chr(10).join(f"- {f}" for f in self.to_delete)}

### 📋 Scripts Organisés ({len(self.to_organize)})
{chr(10).join(f"- {f}" for f in self.to_organize)}

### ✅ Fichiers Conservés ({len(self.to_keep)})
{chr(10).join(f"- {f}" for f in self.to_keep)}

## Structure Organisée

```
web-sentinel/
├── archive_tests/              # Fichiers obsolètes archivés
│   ├── tests_obsoletes/        # Tests Python obsolètes
│   ├── docs_session/           # Documents de session temporaires
│   └── scripts_temporaires/    # Scripts temporaires
├── scripts_utilitaires/        # Scripts de maintenance et build
├── tests/                      # Tests pytest modernes
├── web_sentinel/               # Code source principal
├── dist/                       # Exécutables compilés
└── docs/                       # Documentation
```

## Résultat

Le projet est maintenant :
- ✅ Organisé et structuré
- ✅ Débarrassé des fichiers obsolètes
- ✅ Plus facile à maintenir
- ✅ Structure claire pour nouveaux développeurs

## Prochaines Étapes

1. Vérifier que l'application fonctionne correctement
2. Tester la compilation avec `scripts_utilitaires/build_exe.py`
3. Mettre à jour la documentation si nécessaire
"""
        
        with open(report_file, 'w', encoding='utf-8') as f:
            f.write(report_content)
        
        print(f"  📊 Rapport créé: {report_file}")
    
    def run_cleanup(self):
        """Exécuter le nettoyage complet."""
        print("🧹 NETTOYAGE ET ORGANISATION DU PROJET WEB SENTINEL")
        print("=" * 60)
        
        # Analyser les fichiers
        self.analyze_files()
        
        # Créer les dossiers d'organisation
        self.create_directories()
        
        # Exécuter les actions
        self.archive_files()
        self.organize_utilities()
        self.delete_temp_files()
        self.clean_build_artifacts()
        
        # Créer la documentation
        self.create_readme_files()
        self.create_cleanup_report()
        
        print("\n" + "=" * 60)
        print("🎉 NETTOYAGE TERMINÉ AVEC SUCCÈS!")
        print(f"\n📊 Résumé:")
        print(f"  📦 {len(self.to_archive)} fichiers archivés")
        print(f"  🗑️ {len(self.to_delete)} fichiers supprimés")
        print(f"  📋 {len(self.to_organize)} scripts organisés")
        print(f"  🧹 Artéfacts de build nettoyés")
        
        print(f"\n📁 Structure organisée:")
        print(f"  • archive_tests/ - Fichiers obsolètes")
        print(f"  • scripts_utilitaires/ - Scripts de maintenance")
        print(f"  • tests/ - Tests pytest modernes")
        print(f"  • web_sentinel/ - Code source principal")

def main():
    """Point d'entrée principal."""
    project_root = Path(__file__).parent
    cleaner = ProjectCleaner(project_root)
    cleaner.run_cleanup()
    
    return 0

if __name__ == "__main__":
    sys.exit(main())