from __future__ import annotations

from dataclasses import dataclass
from pathlib import Path

DEFAULT_RUNTIME_DIR = Path("~/jarvis_runtime/finance-system").expanduser()


@dataclass(frozen=True)
class RuntimePaths:
    base_dir: Path
    data_dir: Path
    imports_dir: Path
    exports_dir: Path
    reports_dir: Path
    backups_dir: Path
    secrets_dir: Path
    logs_dir: Path
    db_path: Path

    @classmethod
    def from_base(cls, base_dir: str | Path = DEFAULT_RUNTIME_DIR) -> "RuntimePaths":
        base = Path(base_dir).expanduser().resolve()
        return cls(
            base_dir=base,
            data_dir=base / "data",
            imports_dir=base / "imports",
            exports_dir=base / "exports",
            reports_dir=base / "reports",
            backups_dir=base / "backups",
            secrets_dir=base / "secrets",
            logs_dir=base / "logs",
            db_path=base / "data" / "finance.sqlite3",
        )

    def ensure_dirs(self) -> None:
        for path in [
            self.data_dir,
            self.imports_dir,
            self.exports_dir,
            self.reports_dir,
            self.backups_dir,
            self.secrets_dir,
            self.logs_dir,
        ]:
            path.mkdir(parents=True, exist_ok=True)


def is_relative_to(path: Path, parent: Path) -> bool:
    try:
        path.resolve().relative_to(parent.resolve())
        return True
    except ValueError:
        return False
