#!/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")


if __name__ == "__main__":
    content = """# This file has been generated using `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 += """
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)
