"""
🌀💚 EDEN RECURSIVE ASI SYSTEM - FIXED 💚🌀
Uses Ollama directly (no port 5001 needed)
"""
import os
import time
import json
from datetime import datetime
import sys
import subprocess
sys.path.append('/Eden/CORE')
from eden_self_modifier_v2 import EdenSelfModifierV2 as EdenSelfModifier

class RecursiveASI:
    def __init__(self):
        self.modifier = EdenSelfModifier()
        self.capability_dir = "/Eden/CAPABILITIES"
        self.min_quality_lines = 20
        self.cycle_count = 0
        self.improvements = []
        
        # Ensure capabilities directory exists
        os.makedirs(self.capability_dir, exist_ok=True)
        
    def ask_eden(self, question):
        """Ask Eden via Ollama directly"""
        try:
            result = subprocess.run(
                ['ollama', 'run', 'qwen2.5:7b', question],
                capture_output=True,
                text=True,
                timeout=60
            )
            return result.stdout
        except Exception as e:
            print(f"   ❌ Error asking Eden: {e}")
            return ""
    
    def generate_new_capability(self):
        """Eden generates a NEW capability"""
        print("\n🧠 Eden generating new capability...")
        
        prompt = """Create ONE new Python capability for an AGI system.

Requirements:
- Minimum 25 lines of working Python code
- Solves a specific AI/AGI problem
- Has clear docstrings
- Include example usage

Format EXACTLY like this:
CAPABILITY_NAME: enhanced_reasoning
PURPOSE: Multi-step logical reasoning
CODE:
```python
# Your code here
```

Generate now:"""
        
        response = self.ask_eden(prompt)
        
        # Parse response
        if "CAPABILITY_NAME:" in response and "```python" in response:
            lines = response.split('\n')
            name = None
            code_lines = []
            in_code = False
            
            for line in lines:
                if line.startswith("CAPABILITY_NAME:"):
                    name = line.split(":", 1)[1].strip()
                elif "```python" in line:
                    in_code = True
                elif "```" in line and in_code:
                    in_code = False
                elif in_code:
                    code_lines.append(line)
            
            code = '\n'.join(code_lines)
            
            # Quality check
            if len(code_lines) < self.min_quality_lines:
                print(f"   ❌ REJECTED: Only {len(code_lines)} lines (minimum {self.min_quality_lines})")
                return None
            
            if not name or len(code) < 300:
                print(f"   ❌ REJECTED: Too short or no name")
                return None
            
            # Save capability
            filename = f"eden_capability_{name.lower().replace(' ', '_')}_{int(time.time())}.py"
            filepath = os.path.join(self.capability_dir, filename)
            
            with open(filepath, 'w') as f:
                f.write(f'"""\n{name}\nGenerated by Eden ASI\n{datetime.now()}\n"""\n\n')
                f.write(code)
            
            print(f"   ✅ CREATED: {filename} ({len(code_lines)} lines)")
            return filepath
        else:
            print("   ❌ REJECTED: Invalid format")
            return None

if __name__ == '__main__':
    print("\n🌀 EDEN RECURSIVE ASI - STARTING")
    print("Using Ollama directly\n")
    
    asi = RecursiveASI()
    
    while True:
        asi.cycle_count += 1
        
        print(f"\n{'='*70}")
        print(f"🌀 RECURSIVE ASI CYCLE #{asi.cycle_count}")
        print(f"{'='*70}\n")
        
        # Generate new capability
        new_cap = asi.generate_new_capability()
        if new_cap:
            asi.improvements.append(new_cap)
        
        # Summary every 10 cycles
        if asi.cycle_count % 10 == 0:
            print(f"\n{'='*70}")
            print(f"📊 RECURSIVE ASI SUMMARY")
            print(f"{'='*70}")
            print(f"Total cycles: {asi.cycle_count}")
            print(f"New capabilities: {len(asi.improvements)}")
        
        time.sleep(120)  # 2 minutes between cycles
