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

"""Script to generate Chromium OS quick provision payloads."""

import os

from chromite.lib import commandline
from chromite.lib import constants
from chromite.lib import cros_build_lib
from chromite.lib import osutils
from chromite.lib import parallel
from chromite.lib.paygen import partition_lib
from chromite.lib.paygen import paygen_stateful_payload_lib


def ParseArguments(argv):
  """Returns a namespace for the CLI arguments."""
  parser = commandline.ArgumentParser(description=__doc__)
  parser.add_argument('--image', type='path', required=True,
                      help='The path to local image to build the quick '
                      'provision payloads for.')
  parser.add_argument('--output', type='path',
                      help='The output directory to generate quick '
                      'provision payloads for.', default='.')

  opts = parser.parse_args(argv)
  # Check if output is valid directory.
  if not os.path.isdir(opts.output):
    parser.error('Please pass in a valid output directory.')

  opts.Freeze()

  return opts


def CreateKernelQuickProvisionPayload(image, output):
  with osutils.TempDir() as temp_dir:
    # Extract kernel.
    kern = os.path.join(temp_dir, 'kern')
    partition_lib.ExtractKernel(image, os.path.join(temp_dir, kern))
     # Compress kernel.
    cros_build_lib.CompressFile(
        kern,
        os.path.join(output, constants.QUICK_PROVISION_PAYLOAD_KERNEL))


def CreateRootQuickProvisionPayload(image, output):
  with osutils.TempDir() as temp_dir:
    # Extract root.
    root = os.path.join(temp_dir, 'root')
    partition_lib.ExtractRoot(image, os.path.join(temp_dir, root))
    # Compress root.
    cros_build_lib.CompressFile(
        root,
        os.path.join(output, constants.QUICK_PROVISION_PAYLOAD_ROOTFS))


def CreateStatefulQuickProvisionPayload(image, output):
  # Create stateful quick provision payload.
  paygen_stateful_payload_lib.GenerateStatefulPayload(image, output)
  # Change output ownership of file.


def main(argv):
  opts = ParseArguments(argv)

  parallel.RunParallelSteps([
      # Stateful generation is usually the slowest.
      lambda: CreateStatefulQuickProvisionPayload(opts.image, opts.output),
      lambda: CreateKernelQuickProvisionPayload(opts.image, opts.output),
      lambda: CreateRootQuickProvisionPayload(opts.image, opts.output),
  ])
