#!/usr/bin/env python
#
# Copyright 2013 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
""" Parses manifest file and dumps it to json.
"""

import argparse
import json
import os
import sys
import hashlib

def main():
  parser = argparse.ArgumentParser()

  parser.add_argument(
      '--input', dest='file_path', action='store', required=True)
  parser.add_argument(
      '--clang-cpu', dest='clang_cpu', action='store', required=True)

  args = parser.parse_args()

  with open(args.file_path) as f:
    data = json.load(f)

  output = {}
  target = args.clang_cpu + '-fuchsia'

  for d in data:
    if target in d['target']:
      for runtime in d['runtime']:
        # key contains the soname and the cflags used to compile it.
        # this allows us to distinguish between different sanitizers
        # and experiments
        key = runtime['soname'] + ''.join(d['cflags'])
        md5 = hashlib.md5(key.encode()).hexdigest()
        hash_key = 'md5_%s' % md5
        # Uncomment this line to get the hash keys
        # print runtime['dist'], d['cflags'], hash_key
        output[hash_key] = os.path.dirname(runtime['dist'])

  print(json.dumps(output))

  return 0


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