/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.manifmerger;

import com.android.common.utils.ILogger;
import com.android.util.CommandLineParser;

import java.util.List;


/**
 * Specific command-line flags for the {@link com.android.manifmerger.ManifestMerger}.
 */
class ArgvParser extends CommandLineParser {

    /*
     * Steps needed to add a new action:
     * - Each action is defined as a "verb object" followed by parameters.
     * - Either reuse a VERB_ constant or define a new one.
     * - Either reuse an OBJECT_ constant or define a new one.
     * - Add a new entry to mAction with a one-line help summary.
     * - In the constructor, add a define() call for each parameter (either mandatory
     *   or optional) for the given action.
     */

    public final static String VERB_MERGE       = "merge";                          //$NON-NLS-1$
    public static final String KEY_OUT          = "out";                            //$NON-NLS-1$
    public static final String KEY_MAIN         = "main";                           //$NON-NLS-1$
    public static final String KEY_LIBS         = "libs";                           //$NON-NLS-1$

    /**
     * Action definitions for ManifestMerger command line.
     * <p/>
     * This list serves two purposes: first it is used to know which verb/object
     * actions are acceptable on the command-line; second it provides a summary
     * for each action that is printed in the help.
     * <p/>
     * Each entry is a string array with:
     * <ul>
     * <li> the verb.
     * <li> an object (use #NO_VERB_OBJECT if there's no object).
     * <li> a description.
     * <li> an alternate form for the object (e.g. plural).
     * </ul>
     */
    private final static String[][] ACTIONS = {

            { VERB_MERGE, NO_VERB_OBJECT,
                "Merge two or more manifests." },

    };

    public ArgvParser(ILogger logger) {
        super(logger, ACTIONS);

        // The following defines the parameters of the actions defined in mAction.

        // --- merge manifest ---

        define(Mode.STRING, true,
                VERB_MERGE, NO_VERB_OBJECT, "o", KEY_OUT,                           //$NON-NLS-1$
                "Output path (where to write the merged manifest). Use - for stdout.", null);

        define(Mode.STRING, true,
                VERB_MERGE, NO_VERB_OBJECT, "1", KEY_MAIN,                          //$NON-NLS-1$
                "Path of the main manifest (what to merge *into*)", null);

        define(Mode.STRING_ARRAY, true,
                VERB_MERGE, NO_VERB_OBJECT, "2", KEY_LIBS,                          //$NON-NLS-1$
                "Paths of library manifests to be merged into the main one.",
                null);
    }

    @Override
    public boolean acceptLackOfVerb() {
        return true;
    }

    // -- some helpers for generic action flags

    /** Helper to retrieve the --out value. */
    public String getParamOut() {
        return (String) getValue(null, null, KEY_OUT);
    }

    /** Helper to retrieve the --main value. */
    public String getParamMain() {
        return (String) getValue(null, null, KEY_MAIN);
    }

    /**
     * Helper to retrieve the --libs values.
     */
    public String[] getParamLibs() {
        Object v = getValue(null, null, KEY_LIBS);
        if (v instanceof List<?>) {
            List<?> a = (List<?>) v;
            return a.toArray(new String[a.size()]);
        }
        return null;
    }
}
