#!/usr/bin/env python3
# ex:ts=4:sw=4:sts=4:et
# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
#
# Copyright (c) 2012, Intel Corporation.
# All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# DESCRIPTION
# 'yocto-layer' is the Yocto Tool that helps users create a new Yocto
# layer.  Invoking it without any arguments will display help screens
# for the 'yocto-layer' command and list the available 'yocto-layer'
# subcommands.  Invoking a subcommand without any arguments will
# likewise display help screens for the specified subcommand.  Please
# use that interface for detailed help.
#
# AUTHORS
# Tom Zanussi <tom.zanussi (at] intel.com>
#

__version__ = "0.1.0"

import os
import sys
import optparse
import logging

scripts_path = os.path.abspath(os.path.dirname(os.path.abspath(sys.argv[0])))
lib_path = scripts_path + '/lib'
sys.path = sys.path + [lib_path]

from bsp.help import *
from bsp.engine import *


def yocto_layer_create_subcommand(args, usage_str):
    """
    Command-line handling for layer creation.  The real work is done by
    bsp.engine.yocto_layer_create()
    """
    parser = optparse.OptionParser(usage = usage_str)

    parser.add_option("-o", "--outdir", dest = "outdir", action = "store",
                      help = "name of layer dir to create")
    parser.add_option("-i", "--infile", dest = "properties_file", action = "store",
                      help = "name of file containing the values for layer input properties as a JSON file")
    parser.add_option("-c", "--codedump", dest = "codedump", action = "store_true",
                      default = False, help = "dump the generated code to layergen.out")
    (options, args) = parser.parse_args(args)

    if len(args) < 1 or len(args) > 2:
        logging.error("Wrong number of arguments, exiting\n")
        parser.print_help()
        sys.exit(1)

    layer_name = args[0]
    properties = ""

    if len(args) == 2:
        layer_priority = args[1]
        properties = '{"layer_priority":"' + layer_priority + '"}'

    if options.outdir:
        layer_output_dir = options.outdir
    else:
        prefix="meta-"
        if not layer_name.startswith(prefix):
            layer_output_dir="%s%s"%(prefix,layer_name)
        else:
            layer_output_dir=layer_name

    yocto_layer_create(layer_name, scripts_path, layer_output_dir, options.codedump, options.properties_file, properties)


def yocto_layer_list_subcommand(args, usage_str):
    """
    Command-line handling for listing available layer properties and
    values.  The real work is done by bsp.engine.yocto_layer_list()
    """
    parser = optparse.OptionParser(usage = usage_str)

    parser.add_option("-o", "--outfile", action = "store", dest = "properties_file",
                      help = "dump the possible values for layer properties to a JSON file")

    (options, args) = parser.parse_args(args)

    if not yocto_layer_list(args, scripts_path, options.properties_file):
        logging.error("Bad list arguments, exiting\n")
        parser.print_help()
        sys.exit(1)


subcommands = {
    "create": [yocto_layer_create_subcommand,
               yocto_layer_create_usage,
               yocto_layer_create_help],
    "list":   [yocto_layer_list_subcommand,
               yocto_layer_list_usage,
               yocto_layer_list_help],
}


def start_logging(loglevel):
    logging.basicConfig(filename = 'yocto-layer.log', filemode = 'w', level=loglevel)


def main():
    parser = optparse.OptionParser(version = "yocto-layer version %s" % __version__,
                                   usage = yocto_layer_usage)

    parser.disable_interspersed_args()
    parser.add_option("-D", "--debug", dest = "debug", action = "store_true",
                      default = False, help = "output debug information")

    (options, args) = parser.parse_args()

    loglevel = logging.INFO
    if options.debug:
        loglevel = logging.DEBUG
    start_logging(loglevel)

    if len(args):
        if args[0] == "help":
            if len(args) == 1:
                parser.print_help()
                sys.exit(1)

    invoke_subcommand(args, parser, yocto_layer_help_usage, subcommands)


if __name__ == "__main__":
    try:
        ret = main()
    except Exception:
        ret = 1
        import traceback
        traceback.print_exc()
    sys.exit(ret)

