# Copyright 2022 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.

import re
from enum import Enum

from recipe_engine import recipe_api


class BcidStage(Enum):
  """Enum representing valid bcis stages."""
  START='start'
  FETCH='fetch'
  COMPILE='compile'
  UPLOAD='upload'
  UPLOAD_COMPLETE='upload-complete'
  TEST='test'


class FlutterBcidApi(recipe_api.RecipeApi):

  def is_official_build(self):
    bucket = self.m.buildbucket.build.builder.bucket
    # No-op for builders running outside of dart-internal.
    return bucket == 'flutter'

  def is_prod_build(self):
    bucket = self.m.buildbucket.build.builder.bucket
    return bucket == 'prod'

  def report_stage(self, stage):
    if (self.is_official_build() and
        # TODO(jseales): Uncomment next line after windows
        # can generate provenance succesfully
        # https://github.com/flutter/flutter/issues/116749
        not self.m.platform.is_win):
      self.m.bcid_reporter.report_stage(stage)

  def upload_provenance(self, local_artifact_path, remote_artifact_path):
    """Generate provenance for given artifact.

    This function acts on one specific local file and one specific
    remote file location. It does not accept glob patterns or
    directories.

    parmeters:
      local_artifact_path: (str) path and filename of a specific file.
      remote_artifact_path: (str) path and filename of a specific file.
    """
    if (self.is_official_build() and 
      # TODO(jseales): Uncomment next line after windows
      # can generate provenance succesfully
      # https://github.com/flutter/flutter/issues/116749
      not self.m.platform.is_win):
      sha256 = self.m.file.file_hash(local_artifact_path)
      self.m.bcid_reporter.report_gcs(
          sha256,
          remote_artifact_path
      )

