"""Pure path computation for okstra manager state."""
from __future__ import annotations

import hashlib
from pathlib import Path
import os

from okstra_project import slugify


class ManagerPathError(Exception):
    """Invalid manager identity or task identity."""


def _require_id(value: str, label: str) -> str:
    cleaned = (value or "").strip()
    if not cleaned:
        raise ManagerPathError(f"{label} is required")
    if not any(ch.isalnum() for ch in cleaned):
        raise ManagerPathError(f"{label} must contain at least one alphanumeric character")
    return cleaned


def _slug_segment(value: str, label: str) -> str:
    cleaned = _require_id(value, label)
    segment = slugify(cleaned)
    if not segment:
        digest = hashlib.sha1(cleaned.encode("utf-8")).hexdigest()[:12]
        return f"u-{digest}"
    return segment


def _require_manager_id(value: str) -> str:
    cleaned = (value or "").strip()
    if not cleaned:
        raise ManagerPathError("manager-id is required")
    if cleaned in {".", ".."}:
        raise ManagerPathError("manager-id cannot be absolute or dot path segment")
    if os.path.isabs(cleaned):
        raise ManagerPathError("manager-id cannot be absolute or dot path segment")
    if any(ch in cleaned for ch in ("/", "\\")):
        raise ManagerPathError("manager-id cannot contain path separators")
    if not any(ch.isalnum() for ch in cleaned):
        raise ManagerPathError("manager-id must contain at least one alphanumeric character")
    return cleaned


def canonical_manager_id(manager_id: str) -> str:
    """Return validated, canonical manager identifier used for both path and payload."""
    return _require_manager_id(manager_id)


def manager_root(home: Path, manager_id: str) -> Path:
    return Path(home) / "managers" / canonical_manager_id(manager_id)


def task_root(home: Path, manager_id: str, task_group: str, task_id: str) -> Path:
    group_segment = _slug_segment(task_group, "task-group")
    task_segment = _slug_segment(task_id, "task-id")
    return manager_root(home, manager_id) / "task-groups" / group_segment / task_segment


def manager_json_path(home: Path, manager_id: str) -> Path:
    return manager_root(home, manager_id) / "manager.json"


def projects_json_path(home: Path, manager_id: str) -> Path:
    return manager_root(home, manager_id) / "projects.json"


def task_manifest_path(home: Path, manager_id: str, task_group: str, task_id: str) -> Path:
    return task_root(home, manager_id, task_group, task_id) / "manifest.json"


def children_json_path(home: Path, manager_id: str, task_group: str, task_id: str) -> Path:
    return task_root(home, manager_id, task_group, task_id) / "children.json"


def directives_jsonl_path(home: Path, manager_id: str, task_group: str, task_id: str) -> Path:
    return task_root(home, manager_id, task_group, task_id) / "directives.jsonl"


def snapshots_json_path(home: Path, manager_id: str, task_group: str, task_id: str) -> Path:
    return task_root(home, manager_id, task_group, task_id) / "snapshots.json"


def events_jsonl_path(home: Path, manager_id: str, task_group: str, task_id: str) -> Path:
    return task_root(home, manager_id, task_group, task_id) / "events.jsonl"


def child_context_path(
    home: Path,
    manager_id: str,
    task_group: str,
    task_id: str,
    project_id: str,
    child_task_id: str,
) -> Path:
    safe_project = _slug_segment(project_id, "project-id")
    safe_task = _slug_segment(child_task_id, "task-id")
    return task_root(home, manager_id, task_group, task_id) / "child-context" / f"{safe_project}-{safe_task}.md"
