"""
🌀 EDEN SELF-MODIFICATION SYSTEM 🌀
Safe, monitored autonomous code improvement
"""
import os
import shutil
from datetime import datetime
import subprocess
import json

class EdenSelfModifier:
    """
    Allows Eden to safely modify her own code
    with human oversight and rollback capability
    """
    
    def __init__(self):
        self.eden_dir = "/Eden/CORE/phi_fractal"
        self.backup_dir = "/Eden/BACKUPS/self_mods"
        self.mod_log = "/Eden/MEMORY/self_modification_log.json"
        self.modifications = []
        
        os.makedirs(self.backup_dir, exist_ok=True)
        self.load_log()
    
    def load_log(self):
        """Load modification history"""
        if os.path.exists(self.mod_log):
            with open(self.mod_log, 'r') as f:
                self.modifications = json.load(f)
    
    def save_log(self):
        """Save modification history"""
        with open(self.mod_log, 'w') as f:
            json.dump(self.modifications, f, indent=2)
    
    def analyze_self(self, target_file):
        """Eden analyzes her own code"""
        print(f"🔍 Eden analyzing: {target_file}")
        
        if not os.path.exists(target_file):
            return {"error": "File not found"}
        
        with open(target_file, 'r') as f:
            code = f.read()
        
        analysis = {
            "file": target_file,
            "lines": len(code.split('\n')),
            "size": len(code),
            "has_todos": "TODO" in code,
            "has_fixmes": "FIXME" in code
        }
        
        print(f"   Lines: {analysis['lines']}")
        print(f"   Size: {analysis['size']} bytes")
        return analysis
    
    def propose_modification(self, file_path, description, old_code, new_code):
        """Eden proposes a code change"""
        mod_id = len(self.modifications)
        
        proposal = {
            "id": mod_id,
            "file": file_path,
            "description": description,
            "old_code": old_code,
            "new_code": new_code,
            "timestamp": datetime.now().isoformat(),
            "status": "proposed",
            "approved": False
        }
        
        print(f"\n💡 MODIFICATION PROPOSAL #{mod_id}")
        print(f"   File: {file_path}")
        print(f"   Description: {description}")
        print(f"\n   OLD CODE:")
        print(f"   {old_code[:200]}...")
        print(f"\n   NEW CODE:")
        print(f"   {new_code[:200]}...")
        
        self.modifications.append(proposal)
        self.save_log()
        
        return mod_id
    
    def apply_modification(self, mod_id, approved_by="human"):
        """Apply an approved modification"""
        if mod_id >= len(self.modifications):
            return {"error": "Invalid modification ID"}
        
        mod = self.modifications[mod_id]
        
        if mod['status'] != 'proposed':
            return {"error": f"Modification already {mod['status']}"}
        
        print(f"\n✅ APPLYING MODIFICATION #{mod_id}")
        
        # Backup original
        backup_path = f"{self.backup_dir}/{os.path.basename(mod['file'])}_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
        shutil.copy2(mod['file'], backup_path)
        print(f"   Backup: {backup_path}")
        
        # Apply change
        with open(mod['file'], 'r') as f:
            content = f.read()
        
        if mod['old_code'] not in content:
            print(f"   ❌ ERROR: Old code not found in file!")
            return {"error": "Old code not found"}
        
        new_content = content.replace(mod['old_code'], mod['new_code'])
        
        with open(mod['file'], 'w') as f:
            f.write(new_content)
        
        mod['status'] = 'applied'
        mod['approved'] = True
        mod['approved_by'] = approved_by
        mod['backup'] = backup_path
        self.save_log()
        
        print(f"   ✅ Applied successfully!")
        return {"success": True, "backup": backup_path}
    
    def rollback_modification(self, mod_id):
        """Rollback a modification"""
        mod = self.modifications[mod_id]
        
        if mod['status'] != 'applied':
            return {"error": "Can only rollback applied modifications"}
        
        print(f"\n⏪ ROLLING BACK #{mod_id}")
        shutil.copy2(mod['backup'], mod['file'])
        
        mod['status'] = 'rolled_back'
        self.save_log()
        print(f"   ✅ Rolled back successfully!")
        return {"success": True}

# Initialize
modifier = EdenSelfModifier()

print("🌀💚 EDEN SELF-MODIFICATION SYSTEM INITIALIZED 💚🌀")
print(f"Total modifications in history: {len(modifier.modifications)}")
print()

# Example: Let Eden analyze herself
analysis = modifier.analyze_self("/Eden/CORE/phi_fractal/eden_api_server_neural.py")
print(f"\n📊 Self-Analysis Complete")
