from __future__ import annotations

import json
import os
from pathlib import Path
from typing import Any


class TargetStore:
    """Tiny JSON persistence for each device's selected display target."""

    def __init__(self, path: str | Path) -> None:
        self.path = Path(path).expanduser()

    def _load(self) -> dict[str, str]:
        try:
            value: Any = json.loads(self.path.read_text(encoding="utf-8"))
        except (FileNotFoundError, json.JSONDecodeError, OSError):
            return {}
        if not isinstance(value, dict):
            return {}
        return {key: item for key, item in value.items() if isinstance(key, str) and isinstance(item, str)}

    def get(self, device_id: str) -> str:
        return normalize_target(self._load().get(device_id, "server"))

    def set(self, device_id: str, target: str) -> None:
        targets = self._load()
        targets[device_id] = normalize_target(target)
        self.path.parent.mkdir(parents=True, exist_ok=True, mode=0o700)
        temporary = self.path.with_name(f".{self.path.name}.{os.getpid()}.tmp")
        temporary.write_text(json.dumps(targets, indent=2, sort_keys=True) + "\n", encoding="utf-8")
        os.chmod(temporary, 0o600)
        temporary.replace(self.path)


def normalize_target(target: str) -> str:
    return 'agent:' + target if target.startswith('pi:') else target


def split_target(target: str):
    parts = normalize_target(target).split(':', 2)
    return (parts[1], parts[2]) if len(parts) == 3 and parts[0] == 'agent' and parts[1] in ('pi', 'codex') and parts[2] else None
