#!/usr/bin/env python3
from __future__ import annotations

import argparse
import ast
import os
import re
import subprocess
import sys

ALL_RE = re.compile(r'__all__ = (\([^)]+\))')


def _get_all(cpython: str, version: str) -> frozenset[str]:
    cmd = ('git', '-C', cpython, 'show', f'{version}:Lib/unittest/mock.py')
    out = subprocess.check_output(cmd, stderr=subprocess.DEVNULL).decode()
    match = ALL_RE.search(out)
    assert match is not None
    return frozenset(ast.literal_eval(match[1]))


def main() -> int:
    parser = argparse.ArgumentParser()
    parser.add_argument('cpython')
    args = parser.parse_args()

    prev = _get_all(args.cpython, 'v3.3.0')
    to_add: dict[tuple[int, ...], frozenset[str]] = {(3,): prev}

    for minor in range(6, 999):
        try:
            new = _get_all(args.cpython, f'v3.{minor}.0')
        except subprocess.CalledProcessError:
            break

        if new != prev:
            to_add[(3, minor)] = new - prev
            prev = new

    print(f'# GENERATED VIA {os.path.basename(sys.argv[0])}')
    print(f'# up until cpython 3.{minor - 1}.0')
    for k, v in sorted(to_add.items()):
        print(f'REPLACES[{k}].update((')
        for s in sorted(
                f"    '{orig_mod}=unittest.mock:{attr}',"
                for orig_mod in ('mock', 'mock.mock')
                for attr in v
        ):
            print(s)
        print('))')
    print('# END GENERATED')

    return 0


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