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

"""Android operations."""

import logging
import os
from typing import TYPE_CHECKING

from chromite.api import faux
from chromite.api import validate
from chromite.api.controller import controller_util
from chromite.api.gen.chromite.api import android_pb2
from chromite.lib import constants
from chromite.lib import osutils
from chromite.lib.parser import package_info
from chromite.service import android
from chromite.service import packages

if TYPE_CHECKING:
  from chromite.api import api_config


ANDROIDPIN_MASK_PATH = os.path.join(constants.SOURCE_ROOT,
                                    constants.CHROMIUMOS_OVERLAY_DIR,
                                    'profiles', 'default', 'linux',
                                    'package.mask', 'androidpin')


def _GetLatestBuildResponse(_input_proto, output_proto, _config):
  """Fake GetLatestBuild response."""
  output_proto.android_version = '7123456'


@faux.success(_GetLatestBuildResponse)
@faux.empty_error
@validate.require_any('android_build_branch', 'android_package')
@validate.validation_complete
def GetLatestBuild(input_proto, output_proto, _config):
  branch = (input_proto.android_build_branch or
            android.GetAndroidBranchForPackage(input_proto.android_package))
  build_id, _ = android.GetLatestBuild(branch)
  output_proto.android_version = build_id


def _MarkStableResponse(_input_proto, output_proto, _config):
  """Add fake status to a successful response."""
  output_proto.android_atom.category = 'category'
  output_proto.android_atom.package_name = 'android-package-name'
  output_proto.android_atom.version = '1.2'
  output_proto.status = android_pb2.MARK_STABLE_STATUS_SUCCESS


@faux.success(_MarkStableResponse)
@faux.empty_error
@validate.require('package_name')
@validate.validation_complete
def MarkStable(input_proto: android_pb2.MarkStableRequest,
               output_proto: android_pb2.MarkStableResponse,
               _config: 'api_config.ApiConfig') -> None:
  """Uprev Android, if able.

  Uprev Android, verify that the newly uprevved package can be emerged, and
  return the new package info.

  See AndroidService documentation in api/proto/android.proto.

  Args:
    input_proto: The input proto.
    output_proto: The output proto.
    _config: The call config.
  """
  chroot = controller_util.ParseChroot(input_proto.chroot)
  build_targets = controller_util.ParseBuildTargets(input_proto.build_targets)
  package_name = input_proto.package_name
  android_build_branch = input_proto.android_build_branch
  android_version = input_proto.android_version
  skip_commit = input_proto.skip_commit

  # Assume success.
  output_proto.status = android_pb2.MARK_STABLE_STATUS_SUCCESS
  # TODO(crbug/904939): This should move to service/android.py and the port
  # should be finished.
  android_atom_to_build = None
  try:
    result = packages.uprev_android(
        android_package=package_name,
        chroot=chroot,
        build_targets=build_targets,
        android_build_branch=android_build_branch,
        android_version=android_version,
        skip_commit=skip_commit,
    )
    if result.revved:
      android_atom_to_build = result.android_atom
  except packages.AndroidIsPinnedUprevError as e:
    # If the uprev failed due to a pin, CI needs to unpin and retry.
    android_atom_to_build = e.new_android_atom
    output_proto.status = android_pb2.MARK_STABLE_STATUS_PINNED

  if android_atom_to_build:
    pkg = package_info.parse(android_atom_to_build)
    controller_util.serialize_package_info(pkg, output_proto.android_atom)
  else:
    output_proto.status = android_pb2.MARK_STABLE_STATUS_EARLY_EXIT


# We don't use @faux.success for UnpinVersion because output_proto is unused.
@faux.all_empty
@validate.validation_complete
def UnpinVersion(_input_proto: android_pb2.UnpinVersionRequest,
                 _output_proto: android_pb2.UnpinVersionResponse,
                 _config: 'api_config.ApiConfig') -> None:
  """Unpin the Android version.

  See AndroidService documentation in api/proto/android.proto.

  Args:
    _input_proto: The input proto. (not used.)
    _output_proto: The output proto. (not used.)
    _config: The call config.
  """
  osutils.SafeUnlink(ANDROIDPIN_MASK_PATH)


def _WriteLKGBResponse(_input_proto, output_proto, _config):
  """Fake WriteLKGB response."""
  output_proto.modified_files.append('fake_file')


@faux.success(_WriteLKGBResponse)
@faux.empty_error
@validate.require('android_package', 'android_version')
@validate.validation_complete
def WriteLKGB(input_proto, output_proto, _config):
  android_package = input_proto.android_package
  android_version = input_proto.android_version
  android_package_dir = android.GetAndroidPackageDir(android_package)

  # Attempt to read current LKGB, if available.
  current_lkgb = None
  try:
    current_lkgb = android.ReadLKGB(android_package_dir)
  except android.MissingLKGBError:
    logging.info('LKGB file is missing, creating a new one.')
  except android.InvalidLKGBError:
    logging.warning('Current LKGB file is invalid, overwriting.')

  # Do nothing if LKGB is already set to the requested version.
  if current_lkgb == android_version:
    logging.warning('LKGB of %s is already %s, doing nothing.',
                    android_package, android_version)
    return

  # Actually update LKGB.
  lkgb = android.WriteLKGB(android_package_dir, android_version)
  output_proto.modified_files.append(lkgb)
