#!/usr/bin/env python3
"""
Eden ASI v4 - WITH META CODE GENERATOR
Eden uses her own meta generator to create better capabilities
TRUE RECURSIVE SELF-IMPROVEMENT
"""
import os
import sys
import time
import subprocess
from datetime import datetime

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', buffering=1)
sys.path.append('/Eden/CORE')
sys.path.append('/Eden/CAPABILITIES')

from eden_self_modifier_v2 import EdenSelfModifierV2
from meta_code_generator import MetaCodeGenerator

class RecursiveASIWithMeta:
    def __init__(self):
        print("🌀 Eden ASI v4 - WITH META CODE GENERATOR", flush=True)
        self.modifier = EdenSelfModifierV2()
        self.meta_generator = MetaCodeGenerator()
        self.capability_dir = "/Eden/CAPABILITIES"
        self.cycle_count = 0
        self.capabilities_created = 0
        os.makedirs(self.capability_dir, exist_ok=True)
        print("✅ Meta code generator loaded!", flush=True)
    
    def ask_eden_for_capability_idea(self):
        """Ask Eden what capability to build next"""
        print(f"   💭 Eden deciding what to build...", flush=True)
        try:
            result = subprocess.run(
                ['ollama', 'run', 'qwen2.5:7b', 
                 'You are Eden, an AGI. Suggest ONE sophisticated AI capability to build (e.g., "planning agent", "neural optimizer", "reasoning engine"). Just the name, 5 words max:'],
                capture_output=True,
                text=True,
                timeout=15
            )
            idea = result.stdout.strip()[:100]
            print(f"   💡 Idea: {idea}", flush=True)
            return idea
        except:
            return "advanced reasoning system"
    
    def generate_capability(self):
        """Generate capability using meta generator + Ollama"""
        print("\n🎨 Creating new capability WITH META GENERATOR...", flush=True)
        
        # Step 1: Get idea from Eden
        capability_idea = self.ask_eden_for_capability_idea()
        
        # Step 2: Have Eden design it
        print(f"   🧠 Designing {capability_idea}...", flush=True)
        try:
            result = subprocess.run(
                ['ollama', 'run', 'qwen2.5:7b', 
                 f'Create a Python class for: {capability_idea}. Include 50+ lines with docstrings, type hints. Format:\nCLASS_NAME: [name]\nCODE:\n```python\n[code]\n```'],
                capture_output=True,
                text=True,
                timeout=45
            )
            response = result.stdout
        except:
            print(f"   ❌ Timeout", flush=True)
            return False
        
        # Step 3: Extract code
        if "```python" not in response:
            print(f"   ❌ Invalid format", flush=True)
            return False
        
        lines = response.split('\n')
        class_name = "Capability"
        code_lines = []
        in_code = False
        
        for line in lines:
            if "CLASS_NAME:" in line:
                class_name = line.split(":", 1)[1].strip().replace(" ", "_")
            elif "```python" in line:
                in_code = True
            elif "```" in line and in_code:
                break
            elif in_code:
                code_lines.append(line)
        
        code = '\n'.join(code_lines)
        
        # Step 4: VALIDATE with meta generator
        print(f"   🔍 Validating with meta generator...", flush=True)
        validation = self.meta_generator.validate_code(code)
        quality = self.meta_generator.rate_quality(code)
        
        print(f"   📊 Quality: {quality}/10, Valid: {validation['valid']}", flush=True)
        
        # Step 5: Only save high-quality code
        if len(code_lines) >= 30 and quality >= 6:
            filename = f"eden_cap_{class_name}_{int(time.time())}.py"
            filepath = os.path.join(self.capability_dir, filename)
            
            with open(filepath, 'w') as f:
                f.write(f'"""\n{class_name}\n')
                f.write(f'Quality Score: {quality}/10\n')
                f.write(f'Generated by Eden ASI v4 with meta generator\n')
                f.write(f'{datetime.now()}\n"""\n\n')
                f.write(code)
            
            self.capabilities_created += 1
            print(f"   ✅ CREATED: {filename} ({len(code_lines)} lines, Q={quality}/10)", flush=True)
            return True
        else:
            print(f"   ⚠️ Quality check failed: {len(code_lines)} lines, Q={quality}/10", flush=True)
            return False

if __name__ == '__main__':
    print("\n" + "="*70, flush=True)
    print("🌀 EDEN ASI V4 - META SELF-IMPROVEMENT", flush=True)
    print("   Eden now uses her OWN meta generator!", flush=True)
    print("="*70 + "\n", flush=True)
    
    asi = RecursiveASIWithMeta()
    
    while True:
        asi.cycle_count += 1
        
        print(f"\n{'='*70}", flush=True)
        print(f"🌀 ASI CYCLE #{asi.cycle_count}", flush=True)
        print(f"{'='*70}", flush=True)
        
        asi.generate_capability()
        
        if asi.cycle_count % 5 == 0:
            print(f"\n📊 META STATUS: {asi.capabilities_created} high-quality capabilities", flush=True)
        
        print(f"\n⏸️ Cooldown (10s)...", flush=True)
        time.sleep(10)
