#!/usr/bin/env python3

from __future__ import annotations

import argparse
import inspect
import shutil
from importlib.metadata import entry_points
from pathlib import Path, PurePosixPath
from urllib.parse import urlparse
from urllib.request import urlopen


def schema_filename(schema_uri: str) -> str:
    uri_path = PurePosixPath(urlparse(schema_uri).path)
    if uri_path.name == "schema.json" and uri_path.parent != PurePosixPath("."):
        return f"{uri_path.parent.name}.json"
    return uri_path.name


def main() -> None:
    parser = argparse.ArgumentParser(
        description="Download extension schemas into their package directories."
    )
    parser.add_argument(
        "--dry-run",
        action="store_true",
        help="Show destinations without downloading.",
    )
    args = parser.parse_args()

    repo_root = Path(__file__).resolve().parent.parent
    extensions_dir = repo_root / "extensions"

    for entry_point in entry_points(group="pystac.extensions"):
        extension = entry_point.load()
        module_file = Path(inspect.getfile(type(extension))).resolve()
        if not module_file.is_relative_to(extensions_dir):
            continue

        package_dir = module_file.parents[2]
        for schema_uri in {extension.schema_uri, *[id for id in extension.prev_extension_ids if id.startswith("http")]}:
            destination = (
                package_dir
                / "pystac"
                / "extensions"
                / "json-schema"
                / entry_point.name
                / schema_filename(schema_uri)
            )
            print(f"Pulling {schema_uri} to {destination}")
            if args.dry_run:
                continue

            destination.parent.mkdir(parents=True, exist_ok=True)
            with urlopen(schema_uri) as response, destination.open("wb") as output:
                shutil.copyfileobj(response, output)


if __name__ == "__main__":
    main()