#!/usr/bin/env python3

import argparse
import datetime as dt
import json
import os
import tempfile
from pathlib import Path

ALLOWED = {
    "done",
    "in_progress",
    "pending",
    "blocked",
}


def main():
    parser = argparse.ArgumentParser(
        description="Изменить статус этапа локального плана VM101."
    )

    parser.add_argument("milestone_id")
    parser.add_argument("status", choices=sorted(ALLOWED))
    parser.add_argument("--evidence", action="append", default=[])
    parser.add_argument("--note")
    parser.add_argument(
        "--state-dir",
        default=(
            "/opt/router-ops/state/local-plans/"
            "vm101-hmn-autonomous-egress-recovery"
        ),
    )

    args = parser.parse_args()

    state_dir = Path(args.state_dir)
    path = state_dir / "milestones.json"

    with path.open(encoding="utf-8") as source:
        data = json.load(source)

    target = None

    for item in data["milestones"]:
        if item["id"] == args.milestone_id:
            target = item
            break

    if target is None:
        raise SystemExit(
            f"Не найден этап {args.milestone_id}"
        )

    if args.status == "in_progress":
        for item in data["milestones"]:
            if (
                item["id"] != args.milestone_id
                and item["status"] == "in_progress"
            ):
                item["status"] = "pending"

        data["current_milestone"] = args.milestone_id

    target["status"] = args.status

    if args.note is not None:
        target["notes"] = args.note

    if args.evidence:
        existing = target.setdefault("evidence", [])

        for value in args.evidence:
            if value not in existing:
                existing.append(value)

    if args.status == "done":
        pending = [
            item
            for item in data["milestones"]
            if item["status"] == "pending"
        ]

        in_progress = [
            item
            for item in data["milestones"]
            if item["status"] == "in_progress"
        ]

        if not in_progress and pending:
            pending[0]["status"] = "in_progress"
            data["current_milestone"] = pending[0]["id"]

    data["updated_at_utc"] = (
        dt.datetime.now(dt.timezone.utc)
        .strftime("%Y%m%d-%H%M%S")
    )

    fd, temporary = tempfile.mkstemp(
        prefix="milestones.",
        suffix=".json",
        dir=state_dir,
    )

    try:
        with os.fdopen(fd, "w", encoding="utf-8") as output:
            json.dump(
                data,
                output,
                ensure_ascii=False,
                indent=2,
            )
            output.write("\n")

        os.replace(temporary, path)
    finally:
        if os.path.exists(temporary):
            os.unlink(temporary)

    print(
        f"{args.milestone_id}: {target['status']}"
    )


if __name__ == "__main__":
    main()
