/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

import * as queue from "./queue";
import context_hash from "./context_hash";
import taskcluster from "taskcluster-client";

async function taskHasImageArtifact(taskId) {
  let queue = new taskcluster.Queue();
  let {artifacts} = await queue.listLatestArtifacts(taskId);
  return artifacts.some(artifact => artifact.name == "public/image.tar");
}

async function findTaskWithImageArtifact(ns) {
  let index = new taskcluster.Index();
  let {taskId} = await index.findTask(ns);
  let has_image = await taskHasImageArtifact(taskId);
  return has_image ? taskId : null;
}

export async function findTask({name, path}) {
  let hash = await context_hash(path);
  let ns = `docker.images.v1.${process.env.TC_PROJECT}.${name}.hash.${hash}`;
  return findTaskWithImageArtifact(ns).catch(() => null);
}

export async function buildTask({name, path}) {
  let hash = await context_hash(path);
  let ns = `docker.images.v1.${process.env.TC_PROJECT}.${name}.hash.${hash}`;

  return {
    name: `Image Builder (${name})`,
    image: "nssdev/image_builder:0.1.5",
    routes: ["index." + ns],
    env: {
      NSS_HEAD_REPOSITORY: process.env.NSS_HEAD_REPOSITORY,
      NSS_HEAD_REVISION: process.env.NSS_HEAD_REVISION,
      PROJECT: process.env.TC_PROJECT,
      CONTEXT_PATH: path,
      HASH: hash
    },
    artifacts: {
      "public/image.tar": {
        type: "file",
        expires: 24 * 90,
        path: "/artifacts/image.tar"
      }
    },
    command: [
      "/bin/bash",
      "-c",
      "bin/checkout.sh && nss/automation/taskcluster/scripts/build_image.sh"
    ],
    platform: "nss-decision",
    features: ["dind"],
    maxRunTime: 7200,
    kind: "build",
    symbol: "I"
  };
}
