#!/usr/bin/env python3
"""DevOps: start workflow discovery from recent tickets and wait until ready.

Documented at:
  https://appcd-dev.github.io/stackgen-sdk/code-samples/devops-discover-workflows/

Usage:
  python examples/devops/discover-workflows.py --no-wait
  python examples/devops/discover-workflows.py
"""

from __future__ import annotations

import argparse
import json
import os
import sys

from stackgen import StackgenClient, StackgenConfig
from stackgen.errors import StackgenError


def _config(args: argparse.Namespace) -> StackgenConfig:
    base = (args.base_url or os.environ.get("STACKGEN_URL", "")).strip()
    token = (args.api_token or os.environ.get("STACKGEN_TOKEN", "")).strip()
    org = (
        (args.workspace_id or "").strip()
        or os.environ.get("STACKGEN_WORKSPACE_ID", "").strip()
        or os.environ.get("STACKGEN_ORG_ID", "").strip()
        or os.environ.get("STACKGEN_PROJECT", "").strip()
        or os.environ.get("STACKGEN_PROJECT_ID", "").strip()
    )
    if not base or not token:
        raise SystemExit("set STACKGEN_URL / STACKGEN_TOKEN")
    return StackgenConfig(
        base_url=base,
        api_token=token,
        workspace_id=org,
        timeout_seconds=args.timeout_seconds,
        poll_interval_seconds=args.poll_interval_seconds,
    )


def main() -> int:
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("--base-url", default="")
    parser.add_argument("--api-token", default="")
    parser.add_argument("--workspace-id",
        "--org-id", default="")
    parser.add_argument("--no-wait", action="store_true")
    parser.add_argument("--window-days", type=int, default=0)
    parser.add_argument("--timeout-seconds", type=int, default=1800)
    parser.add_argument("--poll-interval-seconds", type=int, default=5)
    args = parser.parse_args()

    client = StackgenClient(_config(args))
    if args.no_wait:
        try:
            latest = client.devops.latest_workflow_discovery()
        except StackgenError as exc:
            if "404" in str(exc) or "NOT_FOUND" in str(exc):
                print("latest: none (no discovery run yet)")
                return 0
            raise
        print("latest:", json.dumps(latest, indent=2, default=str))
        return 0

    started = client.devops.start_workflow_discovery(
        window_days=args.window_days or None,
    )
    print("started:", json.dumps(started, indent=2, default=str))
    ready = client.devops.wait_for_workflow_discovery()
    print("ready:", json.dumps(ready, indent=2, default=str))
    classes = ready.get("classes") if isinstance(ready, dict) else None
    if isinstance(classes, list):
        for row in classes:
            if isinstance(row, dict):
                print(f"class\t{row.get('id')}\t{row.get('title')}", file=sys.stderr)
    return 0


if __name__ == "__main__":
    try:
        raise SystemExit(main())
    except StackgenError as exc:
        print(f"error: {exc}", file=sys.stderr)
        raise SystemExit(1)
