// Copyright (C) 2017 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.testing;

import static com.google.common.base.Preconditions.checkArgument;

import com.google.common.base.Enums;
import com.google.common.base.Strings;
import com.google.gerrit.server.notedb.GroupsMigration;

public enum GroupNoteDbMode {
  /** NoteDb is disabled, groups are only in ReviewDb */
  OFF(new GroupsMigration(false, false)),

  /** Writing new groups to NoteDb is enabled. */
  WRITE(new GroupsMigration(true, false)),

  /**
   * Reading/writing groups from/to NoteDb is enabled. Trying to read groups from ReviewDb throws an
   * exception.
   */
  READ_WRITE(new GroupsMigration(true, true));

  private static final String ENV_VAR = "GERRIT_NOTEDB_GROUPS";
  private static final String SYS_PROP = "gerrit.notedb.groups";

  public static GroupNoteDbMode get() {
    String value = System.getenv(ENV_VAR);
    if (Strings.isNullOrEmpty(value)) {
      value = System.getProperty(SYS_PROP);
    }
    if (Strings.isNullOrEmpty(value)) {
      return OFF;
    }
    value = value.toUpperCase().replace("-", "_");
    GroupNoteDbMode mode = Enums.getIfPresent(GroupNoteDbMode.class, value).orNull();
    if (!Strings.isNullOrEmpty(System.getenv(ENV_VAR))) {
      checkArgument(
          mode != null, "Invalid value for env variable %s: %s", ENV_VAR, System.getenv(ENV_VAR));
    } else {
      checkArgument(
          mode != null,
          "Invalid value for system property %s: %s",
          SYS_PROP,
          System.getProperty(SYS_PROP));
    }
    return mode;
  }

  private final GroupsMigration groupsMigration;

  private GroupNoteDbMode(GroupsMigration groupsMigration) {
    this.groupsMigration = groupsMigration;
  }

  public GroupsMigration getGroupsMigration() {
    return groupsMigration;
  }
}
