# Copyright 2018 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# This file includes macros to make it easier to log in a standardized format
# so that we can create logs-based metrics for stackdriver.
#
# https://cloud.google.com/logging/docs/logs-based-metrics/

"""A library to help with building/deploying production cobalt packages."""

import subprocess
import tempfile
import shutil
import os

import container_util

COBALT_REPO_CLONE_URL = "https://fuchsia.googlesource.com/cobalt"

def _cobaltb(*args):
  cmd = ['./cobaltb.py']
  cmd.extend(args)
  subprocess.check_call(cmd)

def _select_git_revision():
  tags = subprocess.check_output(['git', 'tag', '-l',
    '--sort=-version:refname']).strip().split('\n')[:5]
  tags.append('HEAD')

  while True:
    print
    print
    print('Which version would you like to build for?')
    for i, tag in enumerate(tags):
      print('({}) {}'.format(i, tag))

    selection = raw_input('? ')
    try:
      selection = int(selection)
      if selection < len(tags):
        return tags[selection]
    except:
      print("Invalid selection")

def build_and_push_production_docker_images(cloud_project_name, production_dir,
    git_revision):
  """ Builds and pushes production-ready docker images from a clean git repo.
  cloud_project_name {sring}: For example "fuchsia-cobalt". The name is used
      when forming the URI to the image in the registry and also the bigtable
      project name.
  production_dir {string}: The directory of the production config files.
  git_revision {string}: A git revision passed in from the command line, if none
    is provided, the user will be prompted to select one.
    latest will be used.
  """

  clean_repo_dir = tempfile.mkdtemp('-cobalt-production-build')

  try:
    subprocess.check_call(['git', 'clone', COBALT_REPO_CLONE_URL,
      clean_repo_dir])

    wd = os.getcwd()
    os.chdir(clean_repo_dir)

    if not git_revision:
      git_revision = _select_git_revision()

    if git_revision is 'HEAD':
      git_revision = subprocess.check_output(['git', 'rev-parse',
        'HEAD']).strip()

    subprocess.check_call(['git', 'checkout', git_revision])
    describe = subprocess.check_output(['git', 'describe']).strip()
    full_rev = subprocess.check_output(['git', 'rev-parse', 'HEAD']).strip()

    _cobaltb('setup')
    _cobaltb('clean', '--full')
    _cobaltb('build')
    _cobaltb('test')

    p = subprocess.Popen(['./cobaltb.py', 'deploy', 'build',
                           '--production_dir=%s' % production_dir],
                           stdin=subprocess.PIPE)
    p.communicate('yes')

    tags_to_apply = ['latest', full_rev]
    if describe is not git_revision:
      tags_to_apply.append(describe)
    subrev = ''
    # This will construct a series of tags based on the version. e.g. if the
    # version is v1.2.3, it would create the tags 'v1', 'v1.2', and 'v1.2.3'
    for part in git_revision.split('.'):
      if subrev is not '':
        subrev += '.'
      subrev += part
      tags_to_apply.append(subrev)

    for tag in tags_to_apply:
      container_util.push_shuffler_to_container_registry('', cloud_project_name,
          tag)
      container_util.push_analyzer_service_to_container_registry('',
          cloud_project_name, tag)
      container_util.push_report_master_to_container_registry('',
          cloud_project_name, tag)

    os.chdir(wd)

    return full_rev
  finally:
    raw_input("Press enter to finish build and delete directory...")
    print("Cleaning up")
    shutil.rmtree(clean_repo_dir)
