from __future__ import annotations

from dataclasses import dataclass
from datetime import date, datetime, timezone
from pathlib import Path

DEFAULT_RUNTIME_DIR = Path("/home/agent/.local/state/CryptoTradingBot/copy_research")


def utc_now_iso() -> str:
    return datetime.now(timezone.utc).isoformat()


def day_string(now: datetime | None = None) -> str:
    value = now or datetime.now(timezone.utc)
    return value.date().isoformat()


@dataclass(frozen=True)
class CopyResearchPaths:
    root: Path = DEFAULT_RUNTIME_DIR

    def snapshots_dir(self, kind: str, day: str | None = None) -> Path:
        return self.root / "snapshots" / kind / (day or day_string())

    def snapshot_file(self, kind: str, day: str | None = None) -> Path:
        return self.snapshots_dir(kind, day) / "snapshots.jsonl"

    def daily_report_file(self, day: str | None = None) -> Path:
        return self.root / "reports" / "daily" / f"{day or day_string()}.md"

    @property
    def discovery_registry_file(self) -> Path:
        return self.root / "state" / "discovery_registry.json"

    @property
    def watchlist_file(self) -> Path:
        return self.root / "state" / "watchlist.json"

    def collector_result_file(self, day: str | None = None) -> Path:
        return self.root / "reports" / "collector_results" / f"{day or day_string()}.json"

    def shadow_dir(self, day: str | None = None) -> Path:
        return self.root / "shadow" / (day or day_string())

    def shadow_position_decisions_file(self, day: str | None = None) -> Path:
        return self.shadow_dir(day) / "position_decisions.jsonl"

    def shadow_portfolio_file(self, day: str | None = None) -> Path:
        return self.shadow_dir(day) / "shadow_portfolio.jsonl"

    def shadow_result_file(self, day: str | None = None) -> Path:
        return self.root / "reports" / "shadow_results" / f"{day or day_string()}.json"

    def observation_run_dir(self) -> Path:
        return self.root / "reports" / "observation_runs"

    def observation_run_log_file(self, day: str | None = None) -> Path:
        return self.observation_run_dir() / f"{day or day_string()}_24h.log"

    def observation_run_status_file(self, day: str | None = None) -> Path:
        return self.observation_run_dir() / f"{day or day_string()}_24h_status.json"

    def observation_run_summary_file(self, day: str | None = None) -> Path:
        return self.observation_run_dir() / f"{day or day_string()}_24h_summary.md"


def ensure_runtime_dirs(paths: CopyResearchPaths, day: str | None = None) -> None:
    for kind in ("vaults", "wallets", "market_context", "vault_details"):
        paths.snapshots_dir(kind, day).mkdir(parents=True, exist_ok=True)
    paths.daily_report_file(day).parent.mkdir(parents=True, exist_ok=True)
    paths.collector_result_file(day).parent.mkdir(parents=True, exist_ok=True)
    paths.shadow_dir(day).mkdir(parents=True, exist_ok=True)
    paths.shadow_result_file(day).parent.mkdir(parents=True, exist_ok=True)
    paths.observation_run_dir().mkdir(parents=True, exist_ok=True)
    paths.discovery_registry_file.parent.mkdir(parents=True, exist_ok=True)
