#!/usr/bin/env python3.8
# 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.

import argparse
import json
import sys


def main():
    parser = argparse.ArgumentParser('Generate a sysmgr config to persist logs')
    parser.add_argument('name', help='Name of the config')
    parser.add_argument('path', help='Path to the package file')
    parser.add_argument('--tags', help='Tag to filter for', nargs='+')
    parser.add_argument('--ignore-tags', help='Tag to ignore', nargs='+')
    parser.add_argument(
        '--file-capacity', help='max allowed disk usage', type=int)
    parser.add_argument(
        '--startup-sleep', help='time to sleep on startup', type=int)
    args = parser.parse_args()

    tag_args = []
    if args.tags:
        for t in args.tags:
            tag_args += ['--tag', t]

    ignore_tag_args = []
    if args.ignore_tags:
        for t in args.ignore_tags:
            ignore_tag_args += ['--ignore-tag', t]

    file_cap_args = []
    if args.file_capacity != None:
        file_cap_args = ['--file_capacity', str(args.file_capacity)]

    startup_sleep_args = []
    if args.startup_sleep != None:
        file_cap_args = ['--startup_sleep', str(args.startup_sleep)]

    with open(args.path, 'w') as f:
        json.dump(
            {
                'apps':
                    [
                        [
                            "fuchsia-pkg://fuchsia.com/log_listener#meta/log_listener.cmx",
                            "--file", "/cache/logs." + args.name
                        ] + file_cap_args + tag_args + ignore_tag_args +
                        startup_sleep_args
                    ]
            }, f)

    return 0


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