/*
 * Copyright 2000-2012 JetBrains s.r.o.
 *
 * 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.intellij.cvsSupport2.config;

import com.intellij.cvsSupport2.CvsUtil;
import com.intellij.cvsSupport2.keywordSubstitution.KeywordSubstitutionWrapper;
import com.intellij.lifecycle.PeriodicalTasksCloser;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
import com.intellij.openapi.components.StoragePathMacros;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vcs.VcsShowConfirmationOption;
import com.intellij.util.Options;
import com.intellij.util.xmlb.XmlSerializerUtil;
import org.netbeans.lib.cvsclient.command.Watch;

import java.util.Arrays;
import java.util.List;

/**
 * author: lesya
 */

@State(
  name="Cvs2Configuration",
  storages= {
    @Storage(
      file = StoragePathMacros.WORKSPACE_FILE
    )}
)
public class CvsConfiguration implements PersistentStateComponent<CvsConfiguration> {

  public static final int DO_NOT_MERGE = 0;
  public static final int MERGE_WITH_BRANCH = 1;
  public static final int MERGE_TWO_BRANCHES = 2;


  public boolean PRUNE_EMPTY_DIRECTORIES = true;

  public int MERGING_MODE = DO_NOT_MERGE;
  public String MERGE_WITH_BRANCH1_NAME = CvsUtil.HEAD;
  public String MERGE_WITH_BRANCH2_NAME = CvsUtil.HEAD;
  public boolean RESET_STICKY = false;
  public boolean CREATE_NEW_DIRECTORIES = true;
  public String DEFAULT_TEXT_FILE_SUBSTITUTION = KeywordSubstitutionWrapper.KEYWORD_EXPANSION.getSubstitution().toString();
  
  public boolean PROCESS_UNKNOWN_FILES;
  public boolean PROCESS_DELETED_FILES;
  public boolean PROCESS_IGNORED_FILES;

  public boolean RESERVED_EDIT;
  public DateOrRevisionSettings CHECKOUT_DATE_OR_REVISION_SETTINGS = new DateOrRevisionSettings();
  public DateOrRevisionSettings UPDATE_DATE_OR_REVISION_SETTINGS = new DateOrRevisionSettings();
  public DateOrRevisionSettings SHOW_CHANGES_REVISION_SETTINGS = new DateOrRevisionSettings();
  public boolean SHOW_OUTPUT = false;
  public int ADD_WATCH_INDEX = 0;
  public List<Watch> WATCHERS = Arrays.asList(Watch.ALL, Watch.EDIT, Watch.UNEDIT, Watch.COMMIT);
  public int REMOVE_WATCH_INDEX = 0;
  public String UPDATE_KEYWORD_SUBSTITUTION = null;

  public boolean MAKE_NEW_FILES_READONLY = false;
  public int SHOW_CORRUPTED_PROJECT_FILES = Options.SHOW_DIALOG;

  public boolean TAG_AFTER_PROJECT_COMMIT = false;
  public boolean OVERRIDE_EXISTING_TAG_FOR_PROJECT = true;
  public String TAG_AFTER_PROJECT_COMMIT_NAME = "";
  public boolean CLEAN_COPY = false;


  public static CvsConfiguration getInstance(Project project) {
    return PeriodicalTasksCloser.getInstance().safeGetService(project, CvsConfiguration.class);
  }

  public static VcsShowConfirmationOption.Value convertToEnumValue(boolean value, boolean onOk) {
    if (value) {
      return VcsShowConfirmationOption.Value.SHOW_CONFIRMATION;
    }
    else if (onOk) {
      return VcsShowConfirmationOption.Value.DO_ACTION_SILENTLY;
    }
    else {
      return VcsShowConfirmationOption.Value.DO_NOTHING_SILENTLY;
    }
  }

  public CvsConfiguration getState() {
    return this;
  }

  public void loadState(CvsConfiguration object) {
    XmlSerializerUtil.copyBean(object, this);
    // safeguard (IDEADEV-15053)
    if (CHECKOUT_DATE_OR_REVISION_SETTINGS == null) {
      CHECKOUT_DATE_OR_REVISION_SETTINGS = new DateOrRevisionSettings();
    }
    if (UPDATE_DATE_OR_REVISION_SETTINGS == null) {
      UPDATE_DATE_OR_REVISION_SETTINGS = new DateOrRevisionSettings();
    }
    if (SHOW_CHANGES_REVISION_SETTINGS == null) {
      SHOW_CHANGES_REVISION_SETTINGS = new DateOrRevisionSettings();
    }
  }
}
