# -*- coding: utf-8 -*-
# Copyright 2016 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.

"""Combine os-release.d fragments into /etc/os-release."""

from __future__ import print_function

import os
import sys

from chromite.lib import commandline
from chromite.lib import cros_build_lib
from chromite.lib import osutils


assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'


def GenerateOsRelease(root, default_params=None):
  """Adds contents of /etc/os-release.d into /etc/os-release

  Args:
    root: path to the root directory where os-release should be genereated.
    default_params: a dict of os-release parameters that should be added
      if not already set.
  """
  os_release_path = os.path.join(root, 'etc', 'os-release')
  os_released_path = os.path.join(root, 'etc', 'os-release.d')

  if not os.path.isdir(os_released_path):
    # /etc/os-release.d does not exist, no need to regenerate /etc/os-release.
    return

  mapping = {}
  if os.path.exists(os_release_path):
    content = osutils.ReadFile(os_release_path)

    for line in content.splitlines():
      if line.startswith('#'):
        continue

      key_value = line.split('=', 1)
      if len(key_value) != 2:
        cros_build_lib.Die('Malformed line in /etc/os-release')

      mapping[key_value[0]] = key_value[1].strip()

  for filepath in os.listdir(os_released_path):
    key = os.path.basename(filepath)
    if key in mapping:
      cros_build_lib.Die('key %s defined in /etc/os-release.d but already '
                         'defined in /etc/os-release.' % key)
    mapping[key] = osutils.ReadFile(os.path.join(os_released_path,
                                                 filepath)).strip('\n')

  if default_params:
    for key, value in default_params.items():
      mapping.setdefault(key, value)

  osrelease_content = '\n'.join([k + '=' + mapping[k] for k in mapping])
  osrelease_content += '\n'
  osutils.WriteFile(os_release_path, osrelease_content)

def main(argv):
  parser = commandline.ArgumentParser(description=__doc__)
  parser.add_argument('--root', type='path', required=True,
                      help='sysroot of the board')
  parser.add_argument('--version', help='The image version string.')
  parser.add_argument('--build_id', help='The image build ID string.')
  options = parser.parse_args(argv)
  options.Freeze()

  default_params = {
      'NAME': 'Chromium OS',
      'ID': 'chromiumos',
      'HOME_URL': 'https://www.chromium.org/chromium-os',
      'BUG_REPORT_URL': 'https://crbug.com/new',
  }

  if options.version:
    default_params['VERSION'] = options.version
    default_params['VERSION_ID'] = options.version
  if options.build_id:
    default_params['BUILD_ID'] = options.build_id

  GenerateOsRelease(options.root, default_params)
