"""
Automatically download, package, containerize and push Factorio server images.

For each version defined, the following will be declared:
  - @factorio-headless-${version}: a repository containing the factorio server tarball
  - //third_party/factorio:${version}-1: a container_image rule to build a docker container running a factorio server
  - //third_party/factorio:push_${version}-1: a container_push rule to push that container image to registry.k0.hswaw.net/app/factorio:${version}-1

In addition, a //third_party/factorio:push_latest rule will also be created for the highest versioned server version. This is for convenience.

To add a new version of Factorio, just update the _versions map with the new version number and the sha256 sum of its tarball.
"""

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

# version -> sha256 of server tarball
_versions = {
    "1.0.0": "81d9e1aa94435aeec4131c8869fa6e9331726bea1ea31db750b65ba42dbd1464",
    "1.1.34": "21969321cf370e95066f86fddfcb83d1a23ed9b67d087c1cb47d43e87673ca69",
    "1.1.35": "245577c809407251ae2920809ee5d0cc4afebdbeb23c730abb8e99a612e2f176",
    "1.1.50": "15148b77a703c25412ed912e4230bdb66e1a9a4450ac52ccf495c2afede2e548",
}

def factorio_repository(version, sha256):
    http_file(
        name = "factorio-headless-%s" % (version),
        urls = [
            "https://factorio.com/get-download/%s/headless/linux64" % (version),
        ],
        sha256 = sha256,
        downloaded_file_path = "factorio.tar.xz",
    )

def factorio_repositories():
    for v, sha256 in _versions.items():
        factorio_repository(v, sha256)

def factorio_image(version, revision):
    image_name = "%s-%d" % (version, revision)
    container_image(
        name = image_name,
        base = "@prodimage-bionic//image",
        tars = ["@factorio-headless-%s//file" % (version)],
        files = [":entrypoint.sh"],
        directory = "/",
        entrypoint = ["/entrypoint.sh"],
    )
    container_push(
        name = "push_%s-%d" % (version, revision),
        image = ":%s" % (image_name),
        format = "Docker",
        registry = "registry.k0.hswaw.net",
        repository = "app/factorio",
        tag = "%s-%d" % (version, revision),
    )

def _sort_by_version(v):
    return [int(el) for el in v.split(".")]

def factorio_images():
    revision_overrides = {
        "0.18.12": 2,
    }
    for v in _versions.keys():
        revision = revision_overrides.get(v, 1)
        factorio_image(v, revision)

    highest_version = sorted(_versions.keys(), key=_sort_by_version, reverse=True)[0]
    revision = revision_overrides.get(highest_version, 1)
    container_push(
        name = "push_latest",
        image = ":%s-%d" % (highest_version, revision),
        format = "Docker",
        registry = "registry.k0.hswaw.net",
        repository = "q3k/factorio",
        tag = "%s-%d" % (highest_version, revision),
    )
