#!/usr/bin/env fuchsia-vendored-python
# Copyright 2021 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.
"""Create a driver documentation from driver metadata."""

import json
import argparse
import os


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument('--name', required=True, help='A name for the driver.')
    parser.add_argument(
        '--driver_path', required=True, help='The path to the driver.')
    parser.add_argument(
        '--doc_input', help='The input JSON documentation file.')
    parser.add_argument(
        '--doc_output',
        required=True,
        type=argparse.FileType('w'),
        help='The output JSON documentation file.')

    args = parser.parse_args()

    documentation = {
        'name': args.name,
        'short_description': '',
        'manufacturer': '',
        'families': [],
        'models': [],
        'areas': [],
        'path': args.driver_path,
        'supported_system_configurations': []
    }
    if (args.doc_input):
        with open(args.doc_input) as doc_input_file:
            doc_contents = json.load(doc_input_file)
            if len(doc_contents['short_description']) < 1:
                raise Exception(
                    "Driver info file: {}, must include a \"short_description\""
                    .format(args.doc_input))
            if len(doc_contents['short_description']) > 80:
                raise Exception(
                    "Driver info file: {} \"short_description\" must be less than 80 characters"
                    .format(args.doc_input))
            documentation['short_description'] = doc_contents[
                'short_description']
            documentation['manufacturer'] = doc_contents['manufacturer']
            documentation['families'] = doc_contents['families']
            documentation['models'] = doc_contents['models']
            if 'supported_system_configurations' in doc_contents.keys():
                documentation['supported_system_configurations'] = doc_contents[
                    'supported_system_configurations']
            if len(doc_contents['areas']) < 1:
                raise Exception(
                    "Driver info file: {}, must include at least one item in \"areas\""
                    .format(args.doc_input))
            documentation['areas'] = doc_contents['areas']

    json.dump(documentation, args.doc_output)


if __name__ == "__main__":
    main()
