/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 org.apache.amaterasu.leader.yarn;

import org.apache.commons.cli.BasicParser;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;

public class ArgsParser {
    private static Options getOptions() {

        Options options = new Options();
        options.addOption("r", "repo", true, "The git repo containing the job");
        options.addOption("b", "branch", true, "The branch to be executed (default is master)");
        options.addOption("e", "env", true, "The environment to be executed (test, prod, etc. values from the default env are taken if np env specified)");
        options.addOption("n", "name", true, "The name of the job");
        options.addOption("i", "job-id", true, "The jobId - should be passed only when resuming a job");
        options.addOption("j", "new-job-id", true, "The jobId - should never be passed by a user");
        options.addOption("r", "report", true, "The level of reporting");
        options.addOption("h", "home", true, "The level of reporting");

        return options;
    }

    public static JobOpts getJobOpts(String[] args) throws ParseException {

        CommandLineParser parser = new BasicParser();
        Options options = getOptions();
        CommandLine cli = parser.parse(options, args);

        JobOpts opts = new JobOpts();
        if (cli.hasOption("repo")) {
            opts.repo = cli.getOptionValue("repo");
        }

        if (cli.hasOption("branch")) {
            opts.branch = cli.getOptionValue("branch");
        }

        if (cli.hasOption("env")) {
            opts.env = cli.getOptionValue("env");
        }

        if (cli.hasOption("job-id")) {
            opts.jobId = cli.getOptionValue("job-id");
        }
        if (cli.hasOption("new-job-id")) {
            opts.newJobId = cli.getOptionValue("new-job-id");
        }

        if (cli.hasOption("report")) {
            opts.report = cli.getOptionValue("report");
        }

        if (cli.hasOption("home")) {
            opts.home = cli.getOptionValue("home");
        }

        if (cli.hasOption("name")) {
            opts.name = cli.getOptionValue("name");
        }

        return opts;
    }
}
