#!/usr/bin/env python3
import hashlib
from pathlib import Path
from typing import Any, Dict, List, Optional

from byteb4rb1e.utils.http import client as http_client


GITHUB_API = "https://api.github.com"


def http_headers(token: Optional[str]) -> Dict[str, str]:
    headers = {
        "Accept": "application/vnd.github+json",
        "User-Agent": "sphinx-h5p-worker1"
    }
    if token:
        # Use standard PAT header; token not logged anywhere.
        headers["Authorization"] = f"Bearer {token}"
    return headers


def blob_sha(path: Path) -> str:
    """Calculate Git blob SHA-1 for a file, matching GitHub API 'sha'."""
    data = path.read_bytes()
    header = f"blob {len(data)}\0".encode("utf-8")
    store = header + data
    return hashlib.sha1(store).hexdigest()


def list_org_repos(org: str, token: Optional[str]) -> List[Dict[str, Any]]:
    repos: List[Dict[str, Any]] = []
    page = 1
    per_page = 100
    while True:
        url = f"{GITHUB_API}/orgs/{org}/repos"
        resp = http_client.get(
            url,
            params={"page": page, "per_page": per_page, "type": "public"},
            headers=http_headers(token),
        )
        if resp.status_code != 200:
            raise RuntimeError(f"Failed to list repos for org {org}: {resp.status_code} {resp.text}")
        batch = resp.json()
        if not batch:
            break
        repos.extend(batch)
        page += 1
    return repos


def fetch_file(
    org: str,
    repo: str,
    path: str,
    token: str
) -> http_client.HttpResponse:
    """
    """
    url = f"{GITHUB_API}/repos/{org}/{repo}/{path}"

    return http_client.get(
        url,
        headers=http_headers(token),
    )
