#!/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.
"""Generate helpdoc reference docs for fx commands and subcommands.

This script calls fx helpdoc and generates reference docs for fx
commands and subcommands.
"""

import sys
import argparse
import os
import subprocess


def run_fx_helpdoc(src_dir, out_path, dep_file, log_to_file=None):
    fx_bin = os.path.join(src_dir, "scripts/fx")
    if log_to_file:
        log_to_file = open(log_to_file, 'w')
    gen_helpdocs = subprocess.run([fx_bin, "helpdoc", "--depfile", dep_file, "--archive", out_path], 
    stdout=log_to_file)
    if gen_helpdocs.returncode:
        print(gen_helpdocs.stderr)
        return 1


def main():
    parser = argparse.ArgumentParser(
        description=__doc__,  # Prepend helpdoc with this file's docstring.
        formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument(
        '-o',
        '--out-path',
        type=str,
        required=True,
        help='Output location where generated docs should go')
    parser.add_argument(
        '-s',
        '--src-dir',
        type=str,
        required=True,
        help='Home location of Fuchsia relative to build')
    parser.add_argument(
        '-l',
        '--log-to-file',
        type=str,
        help='File for logging stdout.')
    parser.add_argument(
        '--depfile', type=argparse.FileType('w'), required=True)

    args = parser.parse_args()
    run_fx_helpdoc(
        args.src_dir,
        args.out_path,
        args.depfile.name,
        args.log_to_file
    )


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