#!/usr/bin/env python
# Copyright 2018 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from __future__ import print_function

import argparse
import collections
import json
import os
import sys


def extract_update_root_keys(manifest_path):
  with open(manifest_path, 'r') as fin:
    manifest = json.loads(fin.read())

  keyids = manifest['signed']['roles']['root']['keyids']
  keys = manifest['signed']['keys']

  rootKeys = []
  for keyid in keyids:
    key = keys[keyid]
    rootKeys.append(collections.OrderedDict((
        ('type', key['keytype']),
        ('value', key['keyval']['public']),
    )))

  return rootKeys


def generate_devhost_config(args):
  manifest_path = os.path.join(args.build_dir, 'amber-files', 'repository', 'root.json')
  rootKeys = extract_update_root_keys(manifest_path)
  status_config = collections.OrderedDict()
  status_config['enabled']=args.enabled

  config = collections.OrderedDict((
      ('id', args.name),
      ('repoUrl', args.repo_url),
      ('blobRepoUrl', args.blobs_url),
      ('rateLimit', 0),
      ('ratePeriod', 0),
      ('rootKeys', rootKeys),
      ('statusConfig', status_config),
      ('auto', True),
  ))

  return config


def parseargs():
  parser = argparse.ArgumentParser(
      description='Generate amber update source config file')

  parser.add_argument(
      '--build-dir',
      required=True,
      help="Fuchsia build output directory")
  parser.add_argument(
      '--name',
      default='devhost',
      help="Name of update source")
  parser.add_argument(
      '--repo-url',
      required=True,
      help="URL of update repository")
  parser.add_argument(
      '--blobs-url',
      required=False,
      help="URL of update blobs repository (<repo-url>/blobs if not specified)")
  parser.add_argument(
      '--output',
      required=True,
      help="Path to write generated config")
  enabled = parser.add_mutually_exclusive_group()
  enabled.add_argument(
      '--enabled',
      dest='enabled',
      action='store_true',
      help="Enable the repository (default)")
  enabled.add_argument(
      '--disabled',
      dest='enabled',
      action='store_false',
      help="Disable the repository")
  enabled.set_defaults(enabled=True)


  args = parser.parse_args()

  return args


def main(args):
  if not args.blobs_url:
    args.blobs_url = '{0}/blobs'.format(args.repo_url)

  if not os.path.isdir(args.build_dir):
    print("Build directory does not exist", file=sys.stderr)
    return 1

  config = generate_devhost_config(args)

  encoded = json.dumps(config, indent=4)
  with open(args.output, 'w') as fout:
    fout.write(encoded)

  return 0


if __name__ == '__main__':
  sys.exit(main(parseargs()))
