"""Inspect failed GitHub Actions runs using the P2HS GitHub App.

Usage on the API server:

    python -m scripts.inspect_template_workflow \
      --repo P2HS/p2hs-template-aura-atelier-react \
      --installation-id 118651114

No personal GitHub token or ``gh`` CLI is required. The output contains the
tail of failed job logs; redact any provider values before sharing it.
"""
from __future__ import annotations

import argparse
import asyncio

from src.integrations.github_client import GitHubAppClient


def parse_args() -> argparse.Namespace:
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("--repo", required=True, help="GitHub owner/repository")
    parser.add_argument("--installation-id", type=int, help="GitHub App installation ID")
    parser.add_argument("--limit", type=int, default=10, help="Number of recent runs to inspect")
    return parser.parse_args()


async def run(args: argparse.Namespace) -> int:
    client = GitHubAppClient(installation_id=args.installation_id)
    runs = await client.list_workflow_runs(args.repo, limit=args.limit)
    if not runs:
        print("No workflow runs found.")
        return 0

    for run in runs:
        print(
            f"RUN id={run.get('id')} status={run.get('status')} "
            f"conclusion={run.get('conclusion')} branch={run.get('head_branch')} "
            f"name={run.get('name')} created={run.get('created_at')}"
        )
        if run.get("conclusion") != "failure":
            continue

        jobs = await client.get_workflow_run_jobs(args.repo, int(run["id"]))
        for job in jobs:
            failed_steps = [
                step for step in (job.get("steps") or []) if step.get("conclusion") == "failure"
            ]
            if not failed_steps and job.get("conclusion") != "failure":
                continue
            names = ", ".join(str(step.get("name")) for step in failed_steps) or "job failed"
            print(f"  JOB id={job.get('id')} name={job.get('name')} failed_step={names}")
            log = await client.get_job_log_text(args.repo, int(job["id"]))
            if log:
                print("  --- failed job log tail ---")
                print(log)
                print("  --- end failed job log tail ---")
    return 0


def main() -> None:
    raise SystemExit(asyncio.run(run(parse_args())))


if __name__ == "__main__":
    main()
