#!/usr/bin/env python

import json
import os
from pathlib import Path

import urllib3

# Get latest version of selenium manager with sha256 values
# updates `//common:selenium_manager.bzl`

http = urllib3.PoolManager()


def get_url():
    r = http.request(
        "GET",
        "https://github.com/SeleniumHQ/selenium_manager_artifacts/releases/latest",
    )
    return r.url.replace("tag", "download")


def get_sha_json():
    r = http.request(
        "GET",
        "https://raw.githubusercontent.com/SeleniumHQ/selenium_manager_artifacts/trunk/latest.json",
    )
    return json.loads(r.data)


def print_linux_x86_64(base_url, sha):
    return """    http_file(
        name = "download_sm_linux_x86_64",
        executable = True,
        sha256 = "{}",
        url = "{}",
    )

""".format(sha, base_url + "/selenium-manager-linux-x86_64")


def print_linux_arm64(base_url, sha):
    return """    http_file(
        name = "download_sm_linux_arm64",
        executable = True,
        sha256 = "{}",
        url = "{}",
    )

""".format(sha, base_url + "/selenium-manager-linux-arm64")


def print_macos(base_url, sha):
    return """    http_file(
        name = "download_sm_macos",
        executable = True,
        sha256 = "{}",
        url = "{}",
    )

""".format(sha, base_url + "/selenium-manager-macos")


def print_windows(base_url, sha):
    return """    http_file(
        name = "download_sm_windows",
        executable = True,
        sha256 = "{}",
        url = "{}",
    )

""".format(sha, base_url + "/selenium-manager-windows.exe")


def print_sbom(base_url, sha):
    return """    http_file(
        name = "download_sm_sbom",
        sha256 = "{}",
        url = "{}",
    )

""".format(sha, base_url + "/selenium-manager.cdx.json")


def print_notice(base_url, sha):
    return """    http_file(
        name = "download_sm_notice",
        sha256 = "{}",
        url = "{}",
    )
""".format(sha, base_url + "/selenium-manager-THIRD-PARTY-NOTICES.txt")


if __name__ == "__main__":
    content = """# DO NOT EDIT! This file is generated by scripts/selenium_manager.py.
# Regenerate with: `bazel run //scripts:selenium_manager`

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file")

def selenium_manager():
"""
    base_url = get_url()
    sha_dict = get_sha_json()
    content = content + print_linux_x86_64(base_url, sha_dict["linux-x86_64"])
    content = content + print_linux_arm64(base_url, sha_dict["linux-arm64"])
    content = content + print_macos(base_url, sha_dict["macos"])
    content = content + print_windows(base_url, sha_dict["windows"])
    content = content + print_sbom(base_url, sha_dict["sbom"])
    content = content + print_notice(base_url, sha_dict["notice"])
    content += """
def _selenium_manager_artifacts_impl(_ctx):
    selenium_manager()

selenium_manager_artifacts = module_extension(
    implementation = _selenium_manager_artifacts_impl,
)
"""

    current_script_dir = Path(os.path.realpath(__file__)).parent
    target_file_path = current_script_dir.parent / "common/selenium_manager.bzl"

    with open(target_file_path, "w") as file:
        file.write(content)
