# Copyright (c) 2026 Roman Shaban. All rights reserved.

# Licensed under the Apache License 2.0.

# Part of the CIOS / Onto-Protocol Ecosystem.

import json

import os

from typing import List, Dict, Optional



STORAGE_DIR = "storage"

TASKS_FILE = os.path.join(STORAGE_DIR, "tasks.json")

RUNS_FILE = os.path.join(STORAGE_DIR, "runs.json")



def _load_json(path: str) -> dict:

    if not os.path.exists(path):

        raise FileNotFoundError(f"File not found: {path}")

    with open(path, "r", encoding="utf-8") as f:

        return json.load(f)



def load_all_tasks() -> Dict[str, dict]:

    return _load_json(TASKS_FILE)



def load_all_runs() -> Dict[str, dict]:

    return _load_json(RUNS_FILE)



def get_tasks_by_run_id(run_id: str) -> List[dict]:

    tasks = load_all_tasks()


    run_tasks = [

        task for task in tasks.values()

        if task.get("run_id") == run_id

    ]


    run_tasks.sort(

        key=lambda t: (

            t.get("depth", 0),

            t.get("timestamp", ""),

            t.get("task_id", "")

        )

    )


    return run_tasks



def get_latest_run_id() -> Optional[str]:

    runs = load_all_runs()


    if not runs:

        return None


    run_items = list(runs.values())

    run_items.sort(key=lambda r: r.get("timestamp", ""), reverse=True)

    return run_items[0]["run_id"]



def show_run_summary(run_id: str):

    run_tasks = get_tasks_by_run_id(run_id)


    print("=== RUN SUMMARY ===")

    print(f"Run ID: {run_id}")

    print(f"Task count: {len(run_tasks)}")


    if not run_tasks:

        print("No tasks found for this run.")

        return


    status_counts = {}

    for task in run_tasks:

        status = task.get("status", "unknown")

        status_counts[status] = status_counts.get(status, 0) + 1


    print("Status breakdown:")

    for status, count in status_counts.items():

        print(f" - {status}: {count}")



def replay_run(run_id: str):

    run_tasks = get_tasks_by_run_id(run_id)


    print("=== REPLAY ENGINE ===")

    print(f"Run ID: {run_id}")

    print(f"Found tasks: {len(run_tasks)}")


    if not run_tasks:

        print("No tasks found for this run.")

        return


    print("\n=== REPLAY STEPS ===")


    for index, task in enumerate(run_tasks, start=1):

        print(f"\nStep {index}")

        print(f"Task ID: {task.get('task_id')}")

        print(f"Parent Task ID: {task.get('parent_task_id')}")

        print(f"Agent: {task.get('agent')}")

        print(f"Intent: {task.get('intent')}")

        print(f"Depth: {task.get('depth')}")

        print(f"Status: {task.get('status')}")

        print(f"Output: {task.get('output')}")

        print(f"Human approved: {task.get('human_approved')}")

        print(f"Timestamp: {task.get('timestamp')}")



def replay_latest_run():

    run_id = get_latest_run_id()


    if run_id is None:

        print("No runs found.")

        return


    show_run_summary(run_id)

    print()

    replay_run(run_id)