/*
 * Copyright 2012-present Facebook, Inc.
 *
 * 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.facebook.buck.cli;

import com.google.common.annotations.VisibleForTesting;

import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.Option;

import java.io.IOException;
import java.io.PrintStream;

public class GenericBuckOptions {

  /**
   * This return code tells calling code (i.e. in Main) that the main help screen should be shown.
   * Actual value chosen to be distinct from actual shell error codes
   */
  public static final int SHOW_MAIN_HELP_SCREEN_EXIT_CODE = -129;

  private static final String BUCK_GIT_COMMIT_KEY = "buck.git_commit";
  private static final String BUCK_GIT_DIRTY_KEY = "buck.git_dirty";

  private final PrintStream stdOut;
  private final PrintStream stdErr;
  private final CmdLineParser parser;

  private final String buckGitCommitHash;
  private final boolean buckGitRepoHasChanges;

  @Option(
      name = "--version",
      aliases = {"-V"},
      usage = "Show version number.")
  private boolean version;

  @Option(
      name = "--help",
      usage = "Shows this screen and exits.")
  private boolean helpScreen;

  public boolean showHelpScreen() {
    return helpScreen;
  }

  public boolean showVersion() {
    return version;
  }

  /**
   * Returns current Buck version, in the form {@code [*]<git-commit-hash>}, where {@code *}
   * indicates that the working tree of the Buck repository is dirty.
   * @return The version of Buck currently running
   */
  private String getBuckVersion() {
    return (buckGitRepoHasChanges ? "*" : "") + buckGitCommitHash;
  }

  @VisibleForTesting
    GenericBuckOptions(
        PrintStream stdOut,
        PrintStream stdErr,
        String buckGitCommitHash,
        boolean buckGitRepoHasChanges) {
    this.stdOut = stdOut;
    this.stdErr = stdErr;
    this.buckGitCommitHash = buckGitCommitHash;
    this.buckGitRepoHasChanges = buckGitRepoHasChanges;
    parser = new CmdLineParser(this);
  }

  public GenericBuckOptions(PrintStream stdOut, PrintStream stdErr) {
    this(
        stdOut,
        stdErr,
        System.getProperty(BUCK_GIT_COMMIT_KEY, "N/A"),
        "1".equals(System.getProperty(BUCK_GIT_DIRTY_KEY, "1")) ? true : false);
  }

  public GenericBuckOptions() {
    this(System.out, System.err);
  }

  public int execute(String[] args) throws IOException{
    try {
      parser.parseArgument(args);
      return execute();
    } catch (CmdLineException e) {
      stdErr.println(e.getMessage());
      return SHOW_MAIN_HELP_SCREEN_EXIT_CODE;
    }
  }

  public void printUsage() {
    new CmdLineParser(this).printUsage(stdErr);
  }

  private int execute() throws IOException {
    if (showHelpScreen()) {
      return SHOW_MAIN_HELP_SCREEN_EXIT_CODE;
    } else if (showVersion()) {
      stdOut.println("buck version " + getBuckVersion());
      return 0;
    }
    return SHOW_MAIN_HELP_SCREEN_EXIT_CODE;
  }
}
