// Copyright (C) 2009 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.google.gerrit.sshd.commands;

import com.google.gerrit.common.data.ApprovalType;
import com.google.gerrit.reviewdb.ApprovalCategory;
import com.google.gerrit.reviewdb.ApprovalCategoryValue;

import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.Option;
import org.kohsuke.args4j.OptionDef;
import org.kohsuke.args4j.spi.OneArgumentOptionHandler;
import org.kohsuke.args4j.spi.OptionHandler;
import org.kohsuke.args4j.spi.Setter;

import java.lang.annotation.Annotation;

final class ApproveOption implements Option, Setter<Short> {
  private final String name;
  private final String usage;
  private final ApprovalType type;

  private Short value;

  ApproveOption(final String name, final String usage, final ApprovalType type) {
    this.name = name;
    this.usage = usage;
    this.type = type;
  }

  @Override
  public String[] aliases() {
    return new String[0];
  }

  @Override
  public Class<? extends OptionHandler<Short>> handler() {
    return Handler.class;
  }

  @Override
  public String metaVar() {
    return "N";
  }

  @Override
  public boolean multiValued() {
    return false;
  }

  @Override
  public String name() {
    return name;
  }

  @Override
  public boolean required() {
    return false;
  }

  @Override
  public String usage() {
    return usage;
  }

  public Short value() {
    return value;
  }

  @Override
  public Class<? extends Annotation> annotationType() {
    return null;
  }

  @Override
  public void addValue(final Short val) {
    this.value = val;
  }

  @Override
  public Class<Short> getType() {
    return Short.class;
  }

  @Override
  public boolean isMultiValued() {
    return false;
  }

  ApprovalCategory.Id getCategoryId() {
    return type.getCategory().getId();
  }

  public static class Handler extends OneArgumentOptionHandler<Short> {
    private final ApproveOption cmdOption;

    public Handler(final CmdLineParser parser, final OptionDef option,
        final Setter<Short> setter) {
      super(parser, option, setter);
      this.cmdOption = (ApproveOption) setter;
    }

    @Override
    protected Short parse(final String token) throws NumberFormatException,
        CmdLineException {
      String argument = token;
      if (argument.startsWith("+")) {
        argument = argument.substring(1);
      }

      final short value = Short.parseShort(argument);
      final ApprovalCategoryValue min = cmdOption.type.getMin();
      final ApprovalCategoryValue max = cmdOption.type.getMax();

      if (value < min.getValue() || value > max.getValue()) {
        final String name = cmdOption.name();
        final String e =
            "\"" + token + "\" must be in range " + min.formatValue() + ".."
                + max.formatValue() + " for \"" + name + "\"";
        throw new CmdLineException(owner, e);
      }
      return value;
    }
  }
}
