# Copyright 2020 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 platform import platform
from recipe_engine.recipe_api import Property

PYTHON_VERSION_COMPATIBILITY = 'PY3'

DEPS = [
    'flutter/repo_util',
    'flutter/yaml',
    'recipe_engine/cipd',
    'recipe_engine/context',
    'recipe_engine/json',
    'recipe_engine/path',
    'recipe_engine/platform',
    'recipe_engine/properties',
    'recipe_engine/step',
]


# This recipe builds the codesign CIPD package.
def RunSteps(api):
  start_path = api.path['start_dir']
  cocoon_dir = start_path.join('cocoon')
  cocoon_git_rev = api.repo_util.checkout(
      'cocoon',
      cocoon_dir,
      ref='refs/heads/main',
  )

  # Get properties from ci.yaml.
  # Assume ci.yaml has the following properties
  #   - name: Mac codesign
  #     bringup: true
  #     postsubmit: false
  #     recipe: cocoon/codesign
  #     properties:
  #       add_recipes_cq: "true"
  #     script: device_doctor/tool/build.sh
  #     cipd_name: flutter/device_doctor/mac-amd64

  script_path_list = api.properties.get('script')
  cipd_full_name = api.properties.get('cipd_name')
  project_name = cipd_full_name.split('/')[1]
  project_path = cocoon_dir.join(project_name)

  build_file = cocoon_dir.join(script_path_list)

  cmd = [build_file]
  if not api.platform.is_win:
    cmd = ['bash', build_file]

  with api.context(cwd=project_path):
    api.step('build package', cmd)

    cipd_zip_path = project_name + '.zip'

    api.cipd.build(project_path.join('build'), cipd_zip_path, cipd_full_name)
    api.cipd.register(cipd_full_name, cipd_zip_path)


def GenTests(api):
  yield api.test(
      'cipd_mac',
      api.properties(
          script='codesign/tool/build.sh',
          cipd_name='flutter/codesign/mac-amd64'
      ),
      api.platform('mac', 64),
  )

  yield api.test(
      'cipd_win',
      api.properties(
          script='device_doctor\\tool\\build.bat',
          cipd_name='flutter/device_doctor/windows-amd64'
      ),
      api.platform('win', 64),
  )
