#!/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(base_url, sha):
    return """    http_file(
        name = "download_sm_linux",
        executable = True,
        sha256 = "{}",
        url = "{}",
    )

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


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(base_url, sha_dict["linux"])
    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)
