// Copyright (C) 2008 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.server.workflow;

import com.google.gerrit.common.data.ApprovalType;
import com.google.gerrit.reviewdb.ApprovalCategory;
import com.google.gerrit.reviewdb.Change;
import com.google.gerrit.reviewdb.RefRight;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.project.RefControl;

/**
 * Computes if the submit function can be used.
 * <p>
 * In order to be considered "approved" this function requires that all approval
 * categories with a position >= 0 (that is any whose
 * {@link ApprovalCategory#isAction()} method returns false) is valid and that
 * the change state be {@link Change.Status#NEW}.
 * <p>
 * This is mostly useful for actions, like {@link ApprovalCategory#SUBMIT}.
 */
public class SubmitFunction extends CategoryFunction {
  public static String NAME = "Submit";

  @Override
  public void run(final ApprovalType at, final FunctionState state) {
    state.valid(at, valid(at, state));
  }

  @Override
  public boolean isValid(final CurrentUser user, final ApprovalType at,
      final FunctionState state) {
    if (valid(at, state)) {
      RefControl rc = state.controlFor(user);
      for (final RefRight pr : rc.getAllRights(at.getCategory().getId())) {
        if (user.getEffectiveGroups().contains(pr.getAccountGroupId())
            && pr.getMaxValue() > 0) {
          return true;
        }
      }
    }
    return false;
  }

  private static boolean valid(final ApprovalType at, final FunctionState state) {
    if (state.getChange().getStatus() != Change.Status.NEW) {
      return false;
    }
    for (final ApprovalType t : state.getApprovalTypes()) {
      if (!state.isValid(t)) {
        return false;
      }
    }
    return true;
  }
}
