#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2020 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.

"""Create the package information file in JSON format.

To get the package information, use the library at
https://cos.googlesource.com/cos/tools/+/refs/heads/master/src/pkg/cos/pkg_info.go
instead of accessing the JSON file directly.

For information on the JSON format, see http://go/cos-package-list-design .
"""

from __future__ import print_function

import collections
import getopt
import json
import re
import sys


# The following regular expresssions are used for extracting the category name,
# the package name, the package version without the revision, and the package
# revision from a string that looks like
#
#   category_name/package_name-1.2.3.4_beta1_rc2-r1
#
# These regular expressions follow the Gentoo package manager specification at
# https://www.gentoo.org/proj/en/qa/pms.xml . They are similar to what SplitPV
# function (in chromite/lib/portage_util.py) uses.

CATEGORY_RE = r'(?P<category>\w[\w\+\.\-]*)'
PACKAGE_RE = r'(?P<package>\w[\w+-]*)'
VERSION_NUMLETTER_RE = r'\d+(\.\d+)*[a-z]?'
VERSION_SUFFIX_RE = r'_(pre|p|beta|alpha|rc)\d*'
VERSION_NO_REV_RE = r'(?P<version_no_rev>%s(%s)*)' % (VERSION_NUMLETTER_RE,
                                                      VERSION_SUFFIX_RE)
REVISION_RE = r'-r(?P<revision>\d+)'
CPV_RE = r'^%s\/%s-%s(%s)?$' % (CATEGORY_RE, PACKAGE_RE,
                                VERSION_NO_REV_RE, REVISION_RE)


def PrintHelp():
  print('usage: create_pkg_list.py --input=<comma separated list '
        'of pkg_type:pkg_info_file> --build-id=<build id> '
        '--output=<output file>')


def CreateList(input_lines):
  cpv_re = re.compile(CPV_RE, re.VERBOSE)
  package_list = []
  for line in input_lines:
    match = cpv_re.match(line.strip())
    if match is not None:
      package_list.append(match.groupdict())
  return package_list


def WriteJson(pkg_info, build_id, output_file):
  result = {}
  for pkg_type, pkg_list in pkg_info.items():
    packages = []
    for p in pkg_list:
      package_info = collections.OrderedDict(
          [('category', p['category']),
           ('name', p['package']),
           ('version', build_id),
           ('ebuild_version', p['version_no_rev'])
          ]
      )
      if 'revision' in p and p['revision'] is not None:
        package_info['ebuild_version'] += '-r' + p['revision']

      packages.append(package_info)

    result[pkg_type] = packages

  json.dump(result, output_file, indent=4)
  return 0


def main(argv):
  input_fn = ''
  output_fn = ''
  build_id = ''

  try:
    opts, args_left = getopt.getopt(argv, '', ['help', 'input=', 'output=', 'build-id='])
  except getopt.GetoptError:
    PrintHelp()
    return -1
  if len(args_left) != 0:
    PrintHelp()
    return -1

  for opt, arg in opts:
    if opt == '--help':
      PrintHelp()
    elif opt == '--input':
      input_fn = arg
    elif opt == '--output':
      output_fn = arg
    elif opt == '--build-id':
      build_id = arg

  if input_fn == '' or output_fn == '':
    PrintHelp()
    return -1

  inputs = input_fn.split(',')
  pkg_info = {}
  for i in inputs:
    # <pkg_type>:<pkg_info_file>
    pkg_type, pkg_info_file = i.split(':', 1)
    input_lines = []
    try:
      with open(pkg_info_file) as input_file:
        input_lines = input_file.readlines()
    except OSError:
      print('error: Failed to open input file: %s' % pkg_info_file)
      return -1
    if len(input_lines) == 0:
      print('warning: No input lines')
      continue

    package_list = CreateList(input_lines)
    if len(package_list) == 0:
      print('warning: Empty package list')
      continue

    pkg_info[pkg_type] = package_list

  try:
    with open(output_fn, 'w') as output_file:
      ret = WriteJson(pkg_info, build_id, output_file)
      if ret != 0:
        print('error: Failed to write package info')
        return ret
  except OSError:
    print('error: Failed to open output file: %s' % output_fn)
    return -1

  return 0


if __name__ == '__main__':
  sys.exit(main(sys.argv[1:]))
