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

from recipe_engine.post_process import (
    Filter,
    StepCommandContains,
    StepCommandRE,
)

DEPS = [
  'dart',
  'recipe_engine/context',
  'recipe_engine/file',
  'recipe_engine/path',
  'recipe_engine/platform',
  'recipe_engine/properties',
  'recipe_engine/step',
  'recipe_engine/url',
]

INSTALLER_NAME = 'install.ps1'
INSTALLER = 'https://chocolatey.org/%s' % INSTALLER_NAME
POWERSHELL = (
  'C:\\\\WINDOWS\\\\system32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe')
CHECKSUM = ('https://storage.googleapis.com/dart-archive/'
  'channels/%s/release/%s/sdk/dartsdk-windows-%s-release.zip.sha256sum')

def RunSteps(api):
  channel = api.properties.get('channel')
  package = api.properties.get('package', 'dart-sdk')
  version = api.properties.get('version')

  installer_path = api.path['cleanup'].join(INSTALLER_NAME)
  api.url.get_file(INSTALLER, installer_path, 'download chocolatey installer')

  choco_home = api.path['cleanup'].join('chocolatey')
  bin_root = api.path['cleanup'].join('bin_root')
  env = {
    'ChocolateyInstall': choco_home,
    'ChocolateyBinRoot': bin_root
  }
  with api.context(env=env):
    api.step('install chocolatey', [POWERSHELL, installer_path])

    choco = choco_home.join('choco')
    api.step('choco --version', [choco, '--version'])

    cache = api.path['cleanup'].join('cache')
    api.step('choco set package directory',
             [choco, 'config', 'set', 'cacheLocation', cache])

    chocolatey_key = api.dart.get_secret('chocolatey')

    # todo(athom): Use git recipe module instead if bug 785362 is ever fixed.
    api.step(
      'checkout chocolatey-packages',
      ['git', 'clone', 'https://github.com/dart-lang/chocolatey-packages.git'])

    checksum = api.url.get_text(CHECKSUM % (channel, version, 'ia32'),
                                default_test_data='abc *should-not-see-this')
    checksum = checksum.output.split()[0]
    checksum64 = api.url.get_text(CHECKSUM % (channel, version, 'x64'),
                                  default_test_data='def *should-not-see-this')
    checksum64 = checksum64.output.split()[0]

    chocolatey_dir = api.path['start_dir'].join('chocolatey-packages')
    package_dir = chocolatey_dir.join(package)
    installer_path = package_dir.join('chocolateyInstall.ps1')
    installer = api.file.read_text('read installer', installer_path)

    installer = installer.replace('$version$', version)
    installer = installer.replace('$channel$', channel)
    installer = installer.replace('$checksum$', checksum)
    installer = installer.replace('$checksum64$', checksum64)

    api.file.write_text('write installer', installer_path, installer)

    with api.context(cwd=package_dir):
      if channel != 'stable':
        # todo(athom): remove when chocolatey supports semver 2.0.0
        # See https://github.com/chocolatey/choco/issues/1610
        # todo(athom): remove extra 'c' character when chocolatey bug is fixed:
        # See https://github.com/chocolatey/chocolatey.org/issues/516
        # 2.1.4-22.13.dev -> 2.1.4.22-c-013-dev
        (version, build) = version.split('-')
        parts = build.split('.')
        # pad with zeros, because chocolatey compares pre-release alphabetically
        version = "%s.%s-c-%s-%s" % (
            (version, parts.pop(0)) + tuple(part.zfill(3) for part in parts))

      api.step('choco pack', [choco, 'pack', 'version=%s' % version])

      api.step('verify with choco install', [
        choco, 'install', package, '--pre', '-y', '-dv', '-s', '.'])

      choco_push = '$secret = cat %s; %s push -k="$secret" %s.%s.nupkg' % (
        chocolatey_key, choco, package, version)
      api.step('choco push', [POWERSHELL, '-Command', choco_push])

def GenTests(api):
  yield api.test(
      'dev',
      api.platform('win', 64),
      api.properties.generic(channel='dev', version='1.2.3-45.0.dev'),
      api.post_process(Filter('choco pack', 'choco push')),
      api.post_process(StepCommandContains, 'choco pack',
                       ['version=1.2.3.45-c-000-dev']),
      api.post_process(StepCommandRE, 'choco push',
                       ['.*', '.*', r'.*1\.2\.3\.45-c-000-dev.nupkg']),
  )
  yield api.test(
      'beta',
      api.platform('win', 64),
      api.properties.generic(channel='beta', version='1.2.3-45.6.beta'),
      api.post_process(Filter('choco pack', 'choco push')),
      api.post_process(StepCommandContains, 'choco pack',
                       ['version=1.2.3.45-c-006-beta']),
      api.post_process(StepCommandRE, 'choco push',
                       ['.*', '.*', r'.*1\.2\.3\.45-c-006-beta.nupkg']),
  )
  yield api.test(
      'release',
      api.platform('win', 64),
      api.properties.generic(channel='stable', version='1.23.4'),
      api.post_process(StepCommandContains, 'choco pack', ['version=1.23.4']),
      api.post_process(StepCommandRE, 'choco push',
                       ['.*', '.*', r'.*1\.23\.4.nupkg']),
  )
