//
// tweakables
//

local registry = "084037375216.dkr.ecr.us-east-2.amazonaws.com";
local build_channel = "zerotier-builds";
local release_channel = "zerotier-releases";

local targets = [
    { "os": "linux", distro: "redhat", "name": "el9",      "isas": [                 "amd64", "arm64", "ppc64le", "s390x" ],                        "events": [ "tag", "custom" ] },
    { "os": "linux", distro: "redhat", "name": "el8",      "isas": [                 "amd64", "arm64", "ppc64le", "s390x" ],                        "events": [ "tag" ] },
    { "os": "linux", distro: "redhat", "name": "el7",      "isas": [ "386",          "amd64",          "ppc64le"],                                  "events": [ "tag" ] },
    { "os": "linux", distro: "amazon", "name": "amzn2",    "isas": [                 "amd64", "arm64" ],                                            "events": [ "tag" ] },
    { "os": "linux", distro: "amazon", "name": "amzn2022", "isas": [                 "amd64", "arm64" ],                                            "events": [ "tag" ] },
    { "os": "linux", distro: "fedora", "name": "fc38",     "isas": [                 "amd64", "arm64", "ppc64le", "s390x" ],                        "events": [ "tag" ] },
    { "os": "linux", distro: "fedora", "name": "fc37",     "isas": [                 "amd64", "arm64", "ppc64le", "s390x" ],                        "events": [ "tag" ] },
    { "os": "linux", distro: "fedora", "name": "fc36",     "isas": [                 "amd64", "arm64", "ppc64le", "s390x" ],                        "events": [ "tag" ] },
    { "os": "linux", distro: "ubuntu", "name": "jammy",    "isas": [        "armv7", "amd64", "arm64", "ppc64le", "s390x", "riscv64" ],             "events": [ "tag" ] },
    { "os": "linux", distro: "ubuntu", "name": "focal",    "isas": [        "armv7", "amd64", "arm64", "ppc64le", "s390x", "riscv64" ],             "events": [ "tag" ] },
    { "os": "linux", distro: "ubuntu", "name": "bionic",   "isas": [ "386", "armv7", "amd64", "arm64", "ppc64le", "s390x" ],                        "events": [ "tag" ] },
    { "os": "linux", distro: "ubuntu", "name": "xenial",   "isas": [ "386", "armv7", "amd64", "arm64", "ppc64le", "s390x" ],                        "events": [ "tag" ] },
    { "os": "linux", distro: "ubuntu", "name": "trusty",   "isas": [ "386", "armv7", "amd64", "arm64" ],                                            "events": [ "tag" ] },
    { "os": "linux", distro: "debian", "name": "bookworm", "isas": [ "386", "armv7", "amd64", "arm64", "mips64le", "ppc64le", "s390x" ],            "events": [ "tag"] },
    { "os": "linux", distro: "debian", "name": "bullseye", "isas": [ "386", "armv7", "amd64", "arm64", "mips64le", "ppc64le", "s390x" ],            "events": [ "push", "tag", "custom" ] },
    { "os": "linux", distro: "debian", "name": "buster",   "isas": [ "386", "armv7", "amd64", "arm64" ],                                            "events": [ "tag" ] },
    { "os": "linux", distro: "debian", "name": "stretch",  "isas": [ "386", "armv7", "amd64", "arm64" ],                                            "events": [ "tag" ] },
    { "os": "linux", distro: "debian", "name": "jessie",   "isas": [ "386", "armv7", "amd64" ],                                                     "events": [ "tag" ] },

//   { "os": "windows", distro: "windows", "name": "windows",  "isas": [ "amd64" ], "events": [ "push", "tag", "custom" ] },
//   { "os": "darwin", distro: "darwin", "name": "darwin",  "isas": [ "amd64" ], "events": [ "push", "tag", "custom" ] },

];

local less_targets = [
      { "os": "linux", distro: "redhat", "name": "el9",      "isas": [                 "amd64", "arm64" ],                        "events": [ "push", "tag", "custom" ] },
      { "os": "linux", distro: "redhat", "name": "el8",      "isas": [                 "amd64", "arm64" ],                        "events": [ "push", "tag", "custom" ] },
      { "os": "linux", distro: "ubuntu", "name": "jammy",    "isas": [        "armv7", "amd64", "arm64" ],             "events": [ "push", "tag", "custom" ] },
      { "os": "linux", distro: "ubuntu", "name": "focal",    "isas": [        "armv7", "amd64", "arm64" ],             "events": [ "push", "tag", "custom" ] },
];


local native_targets = [
      { "os": "linux", distro: "debian", "name": "bullseye", "isas": [ "386", "armv7", "amd64", "arm64" ],            "events": [ "push", "tag", "custom" ] },
];    

local master_targets = [
      //
      // copypasta from here
      //
      { "os": "linux", distro: "redhat", "name": "el9",      "isas": [                 "amd64", "arm64", "ppc64le", "s390x" ],                        "events": [ "push", "tag", "custom" ] },
      { "os": "linux", distro: "redhat", "name": "el8",      "isas": [                 "amd64", "arm64", "ppc64le", "s390x" ],                        "events": [ "push", "tag", "custom" ] },
      { "os": "linux", distro: "redhat", "name": "el7",      "isas": [ "386", "amd64",          "ppc64le"],                                  "events": [ "push", "tag", "custom" ] },
      { "os": "linux", distro: "amazon", "name": "amzn2",    "isas": [                 "amd64", "arm64" ],                                            "events": [ "push", "tag", "custom" ] },
      { "os": "linux", distro: "amazon", "name": "amzn2022", "isas": [                 "amd64", "arm64" ],                                            "events": [ "push", "tag", "custom" ] },
      { "os": "linux", distro: "fedora", "name": "fc38",     "isas": [                 "amd64", "arm64", "ppc64le", "s390x" ],                        "events": [ "push", "tag", "custom" ] },
      { "os": "linux", distro: "fedora", "name": "fc37",     "isas": [                 "amd64", "arm64", "ppc64le", "s390x" ],                        "events": [ "push", "tag", "custom" ] },
      { "os": "linux", distro: "fedora", "name": "fc36",     "isas": [                 "amd64", "arm64", "ppc64le", "s390x" ],                        "events": [ "push", "tag", "custom" ] },
      { "os": "linux", distro: "ubuntu", "name": "jammy",    "isas": [        "armv7", "amd64", "arm64", "ppc64le", "s390x", "riscv64" ],             "events": [ "push", "tag", "custom" ] },
      { "os": "linux", distro: "ubuntu", "name": "focal",    "isas": [        "armv7", "amd64", "arm64", "ppc64le", "s390x", "riscv64" ],             "events": [ "push", "tag", "custom" ] },
      { "os": "linux", distro: "ubuntu", "name": "bionic",   "isas": [ "386", "armv7", "amd64", "arm64", "ppc64le", "s390x" ],                        "events": [ "push", "tag", "custom" ] },
      { "os": "linux", distro: "ubuntu", "name": "xenial",   "isas": [ "386", "armv7", "amd64", "arm64", "ppc64le", "s390x" ],                        "events": [ "push", "tag", "custom" ] },
      { "os": "linux", distro: "ubuntu", "name": "trusty",   "isas": [ "386", "armv7", "amd64", "arm64" ],                                            "events": [ "push", "tag", "custom" ] },
      { "os": "linux", distro: "debian", "name": "sid",      "isas": [ "386", "armv7", "amd64", "arm64", "mips64le", "ppc64le", "s390x", "riscv64" ], "events": [ "push", "tag", "custom" ] },
      { "os": "linux", distro: "debian", "name": "bookworm", "isas": [ "386", "armv7", "amd64", "arm64", "mips64le", "ppc64le", "s390x" ],            "events": [ "push", "tag", "custom" ] },
      { "os": "linux", distro: "debian", "name": "bullseye", "isas": [ "386", "armv7", "amd64", "arm64", "mips64le", "ppc64le", "s390x" ],            "events": [ "push", "tag", "custom" ] },
      { "os": "linux", distro: "debian", "name": "buster",   "isas": [ "386", "armv7", "amd64", "arm64" ],                                            "events": [ "push", "tag", "custom" ] },
      { "os": "linux", distro: "debian", "name": "stretch",  "isas": [ "386", "armv7", "amd64", "arm64" ],                                            "events": [ "push", "tag", "custom" ] },
      { "os": "linux", distro: "debian", "name": "jessie",   "isas": [ "386", "armv7", "amd64" ],                                                     "events": [ "push", "tag", "custom" ] },
      { "os": "windows", distro: "windows", "name": "win2k22", "isas": [ "amd64" ],                                                                     "events": [ "push", "tag", "custom" ] }
];

//
// functions
//

local pipeline_type(os)  = if os == "darwin" then "exec" else "docker";
local builder_image(os)  = if os == "linux" then registry + "/honda-builder" else registry + "/windows-builder";
local tester_image(os)   = if os == "linux" then registry + "/honda-builder" else registry + "/windows-tester";
local build_step_volumes(os) = if os == "linux" then [ { name: "zerotier-builds", path: "/zerotier-builds" } ] else [];
local release_step_volumes(os) = if os == "linux" then [ { name: "zerotier-releases", path: "/zerotier-releases" } ] else [];
local host_volumes(os)   = if os == "linux" then [
  { name: "zerotier-builds", host: { path: "/zerotier-builds" } },
  { name: "zerotier-releases", host: { path: "/zerotier-releases" } },
] else [];

local index_image(distro) =
      if distro == "debian" || distro == "ubuntu" then
          registry + "/apt-builder"
      else if distro == "redhat" || distro == "fedora" || distro == "amazon" then
          registry + "/dnf-builder"
      else if distro == "windows" then
          registry + "/msi-builder"
;          

local copy_commands(os, distro, name, isa, version) =
  if os == "linux" then [
      std.join(" ", [ "./ci/scripts/publish.sh", name, distro, isa, version, "${DRONE_BUILD_EVENT}" ])
    ]
    else if os == "windows" then [  
      "C:\\scripts\\fix-ec2-metadata.ps1",
      "Get-ChildItem windows",
      // "aws s3 cp windows\\bytey-SetupFiles\\bytey.msi s3://zerotier-builds/windows/" + version + "/bytey.msi",
    ] else if os == "darwin" then [
        "echo hello"
      ]
;

local index_commands(os, channel, distro, name, isas) =
      if os == "linux" then
        [ "/usr/local/bin/index " + channel + " " + distro + " " + name  + " " + std.join(" ", isas) ]
      else if os == "windows" then
        [ "Get-ChildItem -Recurse windows" ]
;

local build_commands(os, distro, name, isa, version) =
      if os == "linux" then
        [ std.join(" ", [ "./ci/scripts/build.sh", name, distro, isa, version, "${DRONE_BUILD_EVENT}" ]) ]
      else
        if os == "windows" then
           [ "windows/build.ps1", "windows/package.ps1" ]
      else
        if os == "darwin" then
           [ "whoami" ]
;

local test_commands(os, distro, name, isa, version) =
  if os == "linux" then
    [ std.join(" ", [ "./ci/scripts/test.sh", name, distro, isa, version, "${DRONE_BUILD_EVENT}" ]) ]
  else
    if os == "windows" then
      [ "windows/testpackage.ps1 " + version ]
;

//
// render
//

local Build(os, distro, name, isa, events) = {
  "kind": "pipeline",
  "type": pipeline_type(os),
  "name": std.join(" ", [ name, isa, "build" ]),
  "pull": "always",
  "clone": { "depth": 1, [ if os == "darwin" then "disable" ]: true },
  "steps": [
    {
      "name": "build",
      "image": builder_image(os),
      "commands": build_commands(os, distro, name, isa, "100.0.0+${DRONE_COMMIT_SHA:0:8}"),
      "when": { "event": [ "push" ]},
    },
    {
      "name": "release",
      "image": builder_image(os),
      "commands": build_commands(os, distro, name, isa, "${DRONE_TAG}"),
      "when": { "event": [ "tag" ]},
    },    
    {
      "name": "copy build",
      "image": builder_image(os),
      "commands": copy_commands(os, distro, name, isa, "100.0.0+${DRONE_COMMIT_SHA:0:8}"),
      "volumes": build_step_volumes(os),
      "when": { "event": [ "push" ]},
    },
    {
      "name": "copy relase",
      "image": builder_image(os),
      "commands": copy_commands(os, distro, name, isa, "${DRONE_TAG}"),
      "volumes": release_step_volumes(os),
      "when": { "event": [ "tag" ]},      
    },    
  ],
  "volumes": host_volumes(os),
  "platform": { "os": os, [ if isa == "arm64" || isa == "armv7" then "arch" ]: "arm64" },
  "trigger": { "event": events }
};

local Test(os, distro, name, isa, events) = {
  "kind": "pipeline",
  "type": pipeline_type(os),
  "name": std.join(" ", [ name, isa, "test"]),
  "pull": "always",
  "clone": { "depth": 1 },
  "steps": [
    {
      "name": "test build",
      "image": tester_image(os),
      "volumes": build_step_volumes(os),
      "commands": test_commands(os, distro, name, isa, "100.0.0+${DRONE_COMMIT_SHA:0:8}"),
      "when": { "event": [ "push" ]},
    },
    {
      "name": "test release",
      "image": tester_image(os),
      "volumes": release_step_volumes(os),
      "commands": test_commands(os, distro, name, isa, "${DRONE_TAG}"),
      "when": { "event": [ "tag" ]},
    },    
  ],
  "volumes": host_volumes(os),
  "platform": { "os": os, [ if isa == "arm64" || isa == "armv7" then "arch" ]: "arm64" },
  "depends_on": [ std.join(" ", [ name, "index" ]) ],
  "trigger": { "event": events }
};

local Index(p) = {
  "kind": "pipeline",
  "type": pipeline_type(p.os),
  "name": std.join(" ", [ p.name, "index" ]),
  "pull": "always",
  "clone": { "depth": 1 },
  "steps": [
    {
      "name": "index build",
      "image": index_image(p.distro),
      "commands": index_commands(p.os, "zerotier-builds", p.distro, p.name, p.isas),
      "volumes": build_step_volumes(p.os),
      "environment":{ "GPG_PRIVATE_KEY": { from_secret: "gpg-private-key" }},
      "when": { "event": [ "push" ]},
    },
    {
      "name": "index release",
      "image": index_image(p.distro),
      "commands": index_commands(p.os, "zerotier-releases", p.distro, p.name, p.isas),
      "volumes": release_step_volumes(p.os),
      "environment":{ "GPG_PRIVATE_KEY": { from_secret: "gpg-private-key" }},
      "when": { "event": [ "tag" ]},  
    },    
  ],
  "volumes": host_volumes(p.os),
  "platform": { "os": p.os },
  depends_on: std.flattenArrays([ [ std.join(" ", [ p.name, isa, "build" ]) ] for isa in p.isas ]),
  "trigger": { "event": p.events }
};

//
// print
//

std.flattenArrays([
    [
      Build(p.os, p.distro, p.name, isa, p.events)
        for isa in p.isas
    ] +
    [
      Index(p)
    ]
    for p in native_targets
 ]) +
 std.flattenArrays([
     [
        Test(p.os, p.distro, p.name, isa, p.events)
         for isa in p.isas
     ]
     for p in native_targets
 ])