#!/usr/bin/env python3.8
# Copyright 2020 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.
'''Converts a distribution manifest to the Fuchsia INI format.'''

import argparse
import json


def main():
    parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
    parser.add_argument(
        '--out-file', type=argparse.FileType('w'), required=True)
    parser.add_argument(
        '--dep-file', type=argparse.FileType('w'), required=True)
    parser.add_argument('fidl_json_files', nargs='+')
    args = parser.parse_args()

    output = []
    for fidl_json_file in args.fidl_json_files:
        with open(fidl_json_file, 'r') as f:
            fidl_json = json.load(f)
        output.append(
            {
                'source':
                    fidl_json_file,
                'destination':
                    'data/fidling/' + fidl_json["name"].replace('.', '/') +
                    ".fidl.json"
            })
    json.dump(output, args.out_file)

    args.dep_file.write(
        '{}: {}\n'.format(args.out_file.name, ' '.join(args.fidl_json_files)))


if __name__ == '__main__':
    main()
