"""CLI for importing the approved booking Markdown fixture."""

from __future__ import annotations

import argparse
import json
from pathlib import Path

from .postgres import DatabaseConfig, import_fixture


ENV_KEYS = {
    "ARR_DB_HOST",
    "ARR_DB_PORT",
    "ARR_DB_USER",
    "ARR_DB_PASSWORD",
    "ARR_DB_NAME",
}


def load_config(path: Path) -> DatabaseConfig:
    values: dict[str, str] = {}
    for raw_line in path.read_text(encoding="utf-8").splitlines():
        line = raw_line.strip()
        if not line or line.startswith("#"):
            continue
        key, separator, value = line.partition("=")
        if not separator or key.strip() in values:
            raise RuntimeError("invalid database config structure")
        values[key.strip()] = value.strip().strip('"').strip("'")
    if set(values) != ENV_KEYS or not all(values.values()):
        raise RuntimeError("database config keys are incomplete")
    return DatabaseConfig(
        host=values["ARR_DB_HOST"],
        port=int(values["ARR_DB_PORT"]),
        user=values["ARR_DB_USER"],
        password=values["ARR_DB_PASSWORD"],
        database=values["ARR_DB_NAME"],
    )


def main() -> int:
    parser = argparse.ArgumentParser()
    parser.add_argument("--fixture", required=True, type=Path)
    parser.add_argument("--contract", required=True, type=Path)
    parser.add_argument("--db-env", required=True, type=Path)
    args = parser.parse_args()
    result = import_fixture(
        load_config(args.db_env),
        args.fixture,
        args.contract,
    )
    print(
        json.dumps(
            {
                "status": result.status,
                "source_batch_id": result.source_batch_id,
                "source_rows": result.source_rows,
                "current_parses": result.current_parses,
                "room_items": result.room_items,
                "distinct_group_codes": result.distinct_group_codes,
            },
            ensure_ascii=False,
            indent=2,
        )
    )
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
