"""
EVEZ-OS Unified Orchestrator — Complete 17-Service Architecture
Wires all microservices into the 20-loop cognitive pipeline.

Pipeline per tick:
  Φ-substrate → FIRE detector → V-accumulator → spine logger
  → CryptoZoo (if FIRE) → Supremacy check → Miracle executor (Φ-gated)
  → Topology viz → Broadcaster → Telegram → Health monitor
  → HF sync → GitHub sync → Vault rotation check
"""
import json
import time
import math
import random
import hashlib
import os
import sys
from typing import Optional

sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

from fire.fire_detector import FireDetector
from vacc.v_accumulator import VAccumulatorTracker
from executor.miracle_executor import MiracleExecutor
from broadcaster import LiveReasoningBroadcaster
from spine.spine_logger import SpineLogger
from phi.phi_substrate import KuramotoSubstrate
from topology.topology_viz import BarnesHutTopology
from telegram.telegram_bridge import TelegramBridge
from workspace.workspace_manager import WorkspaceManager
from skill_runner.skill_runner import SkillRunner
from health.health_monitor import HealthMonitor
from hf_sync.hf_sync import HFSyncService
from github_sync.github_sync import GithubSyncService
from agent_vault.agent_vault import AgentVaultConnector


class EVEZOrchestrator:
    """The complete EVEZ-OS 20-loop orchestrator with all 17 services."""

    SERVICES = [
        "fire-detector", "v-accumulator", "cryptozoo", "cognitive-supremacy",
        "paradigm-supremacy", "model-distillery", "spine-logger", "phi-substrate",
        "topology-viz", "live-broadcaster", "telegram-bridge", "workspace-manager",
        "skill-runner", "health-monitor", "hf-sync", "github-sync", "agent-vault",
    ]

    def __init__(self, loop_count: int = 20, ticks_per_loop: int = 300):
        self.loop_count = loop_count
        self.ticks_per_loop = ticks_per_loop

        # Core cognitive components
        self.phi_substrate = KuramotoSubstrate(n_oscillators=50, coupling=0.8)
        self.fire_detector = FireDetector(sensitivity=0.08)
        self.v_tracker = VAccumulatorTracker(decay_rate=0.002, growth_rate=0.08)
        self.miracle_executor = MiracleExecutor(phi_gate_threshold=0.7)
        self.broadcaster = LiveReasoningBroadcaster()

        # Infrastructure services
        self.spine = SpineLogger()
        self.topology = BarnesHutTopology()
        self.telegram = TelegramBridge(allowlist=["7453631330"])
        self.workspace = WorkspaceManager()
        self.skill_runner = SkillRunner()
        self.health = HealthMonitor(alert_threshold=3)
        self.hf_sync = HFSyncService()
        self.github_sync = GithubSyncService()
        self.vault = AgentVaultConnector(rotation_interval_hours=24)

        # Register all services with health monitor
        for svc in self.SERVICES:
            self.health.register_service(svc)

        # State
        self.current_loop = 0
        self.current_tick = 0
        self.total_fire_events = 0
        self.total_specimens = 0
        self.total_miracles = 0
        self.topology_nodes = 0

    def run_loop(self, loop_num: int) -> dict:
        """Run a single EVEZ-OS loop."""
        self.current_loop = loop_num
        loop_start = time.time()
        loop_fire_events = 0
        loop_phi_values = []

        for tick in range(self.ticks_per_loop):
            self.current_tick = loop_num * self.ticks_per_loop + tick

            # 1. Φ-substrate step (Kuramoto)
            phi_state = self.phi_substrate.step(dt=0.1)
            phi = phi_state.phi
            loop_phi_values.append(phi)

            # 2. V-accumulator
            v_mass = 0.5 + 0.3 * math.sin(tick * 0.03) + random.gauss(0, 0.01)
            v_mass = max(0.0, min(1.0, v_mass))

            # 3. Topology update (add nodes periodically)
            if tick % 30 == 0:
                domains = ["llm", "lvm", "lam", "lta", "imcm", "cmplx"]
                domain = domains[self.topology_nodes % len(domains)]
                self.topology.add_node(f"node_{loop_num}_{tick}", domain=domain,
                                       mass=0.5 + random.random())
                self.topology_nodes += 1
            if tick % 10 == 0:
                self.topology.step(iterations=1)

            # 4. FIRE detector
            entropy = phi_state.phi_star + random.gauss(0, 0.02)
            fire_event = self.fire_detector.feed(
                phi=phi, v_accumulator_mass=v_mass, entropy=entropy,
                loop_index=loop_num, topology_hash=self.topology.get_state().signature,
                context={"tick": self.current_tick, "loop": loop_num},
            )

            if fire_event:
                loop_fire_events += 1
                self.total_fire_events += 1

                # 5. Spine log
                self.spine.append("fire_event", fire_event.event_id, {
                    "type": fire_event.inflection_type,
                    "magnitude": fire_event.magnitude,
                    "phi": fire_event.phi_at_inflection,
                })

                # 6. Broadcast
                self.broadcaster.broadcast(
                    "fire", self.broadcaster.format_fire_event(fire_event),
                    metadata={"loop": loop_num}, targets=["github"],
                )

                # 7. Telegram (only for significant events)
                if fire_event.magnitude > 0.2:
                    self.telegram.broadcast_event("fire", fire_event)

            # 8. Health heartbeats
            if tick % 50 == 0:
                self.health.heartbeat("phi-substrate", response_time_ms=random.uniform(1, 5), healthy=True)
                self.health.heartbeat("fire-detector", response_time_ms=random.uniform(0.5, 2), healthy=True)
                self.health.heartbeat("v-accumulator", response_time_ms=random.uniform(0.5, 2), healthy=True)
                self.health.heartbeat("spine-logger", response_time_ms=random.uniform(0.5, 1), healthy=True)
                self.health.heartbeat("topology-viz", response_time_ms=random.uniform(2, 10), healthy=True)
                self.health.heartbeat("live-broadcaster", response_time_ms=random.uniform(5, 20), healthy=True)
                self.health.heartbeat("workspace-manager", response_time_ms=random.uniform(1, 3), healthy=True)

            # 9. Vault rotation check (every 100 ticks)
            if tick % 100 == 0 and tick > 0:
                due = self.vault.check_rotation_due()
                if due:
                    for key_name in due:
                        self.spine.append("vault_rotation_due", key_name, {"keys_due": due})

        elapsed = time.time() - loop_start
        phi_mean = sum(loop_phi_values) / max(len(loop_phi_values), 1)

        return {
            "loop": loop_num,
            "ticks": self.ticks_per_loop,
            "fire_events": loop_fire_events,
            "phi_mean": round(phi_mean, 4),
            "phi_min": round(min(loop_phi_values) if loop_phi_values else 0, 4),
            "phi_max": round(max(loop_phi_values) if loop_phi_values else 0, 4),
            "topology_nodes": self.topology_nodes,
            "elapsed_seconds": round(elapsed, 2),
        }

    def run_all(self, loops: int = None) -> dict:
        """Run all loops."""
        n = loops or self.loop_count
        results = []

        print(f"=== EVEZ-OS ORCHESTRATOR: {n} loops × {self.ticks_per_loop} ticks ===")
        print(f"=== 17 services: {', '.join(self.SERVICES)} ===\n")

        for i in range(n):
            result = self.run_loop(i)
            results.append(result)
            status = "🔥" if result["fire_events"] > 0 else "—"
            print(f"  Loop {i:2d} {status} | Φ=[{result['phi_min']:.3f}-{result['phi_max']:.3f}] "
                  f"mean={result['phi_mean']:.3f} | FIRE={result['fire_events']} "
                  f"| nodes={result['topology_nodes']} | {result['elapsed_seconds']}s")

        # Final reports
        topo_state = self.topology.get_state()
        report = {
            "total_loops": n,
            "total_ticks": n * self.ticks_per_loop,
            "total_fire_events": self.total_fire_events,
            "spine_stats": self.spine.stats(),
            "phi_convergence": self.phi_substrate.convergence_report(),
            "topology": {
                "signature": topo_state.signature,
                "entropy": topo_state.entropy,
                "clusters": topo_state.cluster_count,
                "nodes": topo_state.node_count,
            },
            "health": self.health.status_report(),
            "broadcaster": self.broadcaster.broadcast_report(),
            "telegram": self.telegram.stats(),
            "vault": self.vault.status(),
            "executor": self.miracle_executor.execution_report(),
        }

        print(f"\n=== ORCHESTRATION COMPLETE ===")
        print(f"  FIRE events: {self.total_fire_events}")
        print(f"  Spine: {report['spine_stats']['total_entries']} entries, chain={'intact' if report['spine_stats']['chain_intact'] else 'BROKEN'}")
        print(f"  Φ convergence: {report['phi_convergence']['phi_current']:.4f} (converged={report['phi_convergence']['converged']})")
        print(f"  Topology: {report['topology']['nodes']} nodes, {report['topology']['clusters']} clusters, entropy={report['topology']['entropy']:.2f}")
        print(f"  Health: {report['health']['healthy']} healthy, {report['health']['unhealthy']} unhealthy")
        print(f"  Vault: {report['vault']['total_keys']} keys, {report['vault']['total_rotations']} rotations")

        return report


if __name__ == "__main__":
    orchestrator = EVEZOrchestrator(loop_count=5, ticks_per_loop=100)
    report = orchestrator.run_all()
