#!/usr/bin/env python3
"""ASI Unique Scorer - LLM-based evolution with uniqueness rewards"""
import sqlite3, hashlib, subprocess, re, time, random, zlib
import time

DB = "/mnt/eden_ram/asi_memory.db"

def extract(text):
    lines = []
    for line in text.split('\n'):
        s = line.strip()
        if s.startswith(('Here', 'This ', 'The ', 'I ', 'Note:', 'Example', '---')):
            if lines: break
            continue
        if s.startswith(('import ', 'from ', 'class ', 'def ', '@', '#', '"""', "'''")) or \
           s.startswith(('    ', '\t')) or '=' in s or 'return ' in s or s == '':
            lines.append(line)
    code = '\n'.join(lines).strip()
    return code if ('def ' in code or 'class ' in code) else None

def score(code):
    s = 0
    classes = set(re.findall(r'^class\s+(\w+)', code, re.MULTILINE))
    functions = set(re.findall(r'def\s+(\w+)', code))
    s += len(classes) * 5
    s += len(functions) * 2
    if len(code) > 100:
        ratio = len(zlib.compress(code.encode())) / len(code)
        s += ratio * 30
    if 'mutate' in code.lower(): s += 5
    if 'evolve' in code.lower(): s += 5
    if 'ast' in code.lower(): s += 5
    return s

def evolve():
    conn = sqlite3.connect(DB)
    best = conn.execute("SELECT code, gen FROM caps ORDER BY score DESC LIMIT 1").fetchone()
    if not best:
        conn.close()
        return 0, 0, 0
    code, gen = best[0], best[1] + 1
    
    prompt = f"Create UNIQUE Python code. Add mutate(), evolve() methods. Seed {random.randint(1000,9999)}:\n{code[:1500]}\nOutput ONLY code."
    
    try:
        r = subprocess.run(["ollama", "run", "eden-coder-omega", prompt],
                          capture_output=True, text=True, timeout=120)
        new_code = extract(r.stdout)
        if new_code and len(new_code) > 100:
            new_code += f"\n# unique_g{gen}_{random.randint(100,999)}"
            s = score(new_code)
            cid = hashlib.sha256(new_code.encode()).hexdigest()[:16]
            conn.execute("INSERT OR IGNORE INTO caps VALUES (?,?,?,?)", (cid, new_code, s, gen))
            conn.commit()
            conn.close()
            return 1, gen, s
    except: pass
    conn.close()
    return 0, gen, 0

print("⚡ Unique Scorer - Running")
while True:
    try:
        n, gen, s = evolve()
        if n: print(f"⚡ Gen {gen}: +{n} | Score: {s:.1f}")
        time.sleep(5)
    except KeyboardInterrupt:
        print("Done"); break
    except Exception as e:
        time.sleep(10)
