#!/usr/bin/env python3
"""Shared constants for the Studio autonomy loop."""

from __future__ import annotations

import sys
from datetime import datetime, timedelta
from pathlib import Path
from zoneinfo import ZoneInfo

# Bootstrap the repo root onto sys.path using the same expression as nightwatch.py.
_REPO_ROOT = Path(__file__).resolve().parents[3]
if str(_REPO_ROOT) not in sys.path:
    sys.path.insert(0, str(_REPO_ROOT))

from recoil.pipeline.tools import nightwatch  # noqa: E402

STATE_DIR = Path.home() / ".local/state/studio-autonomy"
LEASE_PATH = STATE_DIR / "autonomy.lease.json"
LEASE_LOCK = STATE_DIR / "autonomy.lease.lock"
CLAIM_LEDGER = STATE_DIR / "claim-ledger.jsonl"
BREAKER_DIR = STATE_DIR / "breakers"
USAGE_LOG = STATE_DIR / "usage.jsonl"
MAINT_DIR = STATE_DIR / "maintenance"

WORKTREES_ROOT = Path.home() / "Code/recoil-sessions"
EVENTS_LEDGER = nightwatch.DEFAULT_LEDGER

NIGHT_WINDOW = (18, 7)
NIGHT_TZ = "America/New_York"

MAX_BUILDS_PER_NIGHT = 2
BUILD_WALLCLOCK_SECONDS = 3 * 60 * 60
TICK_LEASE_TTL = 15 * 60
BUILD_LEASE_TTL = 5 * 60
BUILD_LEASE_HEARTBEAT = 60

EVENT_TYPES = frozenset(
    {
        "tick_started",
        "busy_exit",
        "yield_human_active",
        "no_work",
        "preflight_failed",
        "issue_claimed",
        "shadow_would_dispatch",
        "dispatch_started",
        "spec_review_failed",
        "cap_tripped",
        "rate_limited",
        "pr_opened",
        "build_capped",
        "build_killed",
        "maintenance_ran",
    }
)

SHLOCK = "/usr/bin/shlock"


def ensure_state_dir() -> Path:
    STATE_DIR.mkdir(parents=True, exist_ok=True)
    STATE_DIR.chmod(0o700)
    return STATE_DIR


def current_night_id(now: datetime | None = None) -> str:
    tz = ZoneInfo(NIGHT_TZ)
    if now is None:
        local_now = datetime.now(tz)
    elif now.tzinfo is None:
        local_now = now.replace(tzinfo=tz)
    else:
        local_now = now.astimezone(tz)

    evening_date = local_now.date()
    if local_now.hour < NIGHT_WINDOW[1]:
        evening_date -= timedelta(days=1)

    return f"{evening_date:%Y-%m-%d}-evening"
