/*
 * Copyright 2000-2013 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 org.jetbrains.plugins.terminal;

import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.components.*;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.text.StringUtil;
import com.jediterm.terminal.emulator.ColorPalette;
import org.jetbrains.annotations.NotNull;

import java.io.File;

/**
 * @author traff
 */
@State(
  name = "TerminalOptionsProvider",
  storages = {
    @Storage(
      file = StoragePathMacros.APP_CONFIG + "/terminal.xml"
    )}
)
public class TerminalOptionsProvider implements PersistentStateComponent<TerminalOptionsProvider.State>, ExportableApplicationComponent {
  private State myState = new State();

  public static TerminalOptionsProvider getInstance() {
    return ApplicationManager.getApplication().getComponent(TerminalOptionsProvider.class);
  }

  @Override
  public State getState() {
    return myState;
  }

  @Override
  public void loadState(State state) {
    myState.myShellPath = state.myShellPath;
    myState.myCloseSessionOnLogout = state.myCloseSessionOnLogout;
    myState.myReportMouse = state.myReportMouse;
    myState.mySoundBell = state.mySoundBell;
    myState.myTabName = state.myTabName;
    myState.myCopyOnSelection = state.myCopyOnSelection;
    myState.myPasteOnMiddleMouseButton = state.myPasteOnMiddleMouseButton;
  }

  public boolean closeSessionOnLogout() {
    return myState.myCloseSessionOnLogout;
  }

  public boolean enableMouseReporting() {
    return myState.myReportMouse;
  }

  public boolean audibleBell() {
    return myState.mySoundBell;
  }

  public String getTabName() {
    return myState.myTabName;
  }

  public static class State {
    public String myShellPath = getDefaultShellPath();
    public String myTabName = "Local";
    public boolean myCloseSessionOnLogout = true;
    public boolean myReportMouse = true;
    public boolean mySoundBell = true;
    public boolean myCopyOnSelection = true;
    public boolean myPasteOnMiddleMouseButton = true;
  }

  public String getShellPath() {
    return myState.myShellPath;
  }

  private static String getDefaultShellPath() {
    if (SystemInfo.isUnix) {
      return "/bin/bash";
    }
    else {
      return "cmd.exe";
    }
  }

  public void setShellPath(String shellPath) {
    myState.myShellPath = shellPath;
  }

  public void setTabName(String tabName) {
    myState.myTabName = tabName;
  }

  public void setCloseSessionOnLogout(boolean closeSessionOnLogout) {
    myState.myCloseSessionOnLogout = closeSessionOnLogout;
  }

  public void setReportMouse(boolean reportMouse) {
    myState.myReportMouse = reportMouse;
  }

  public void setSoundBell(boolean soundBell) {
    myState.mySoundBell = soundBell;
  }

  public boolean copyOnSelection() {
    return myState.myCopyOnSelection;
  }

  public void setCopyOnSelection(boolean copyOnSelection) {
    myState.myCopyOnSelection = copyOnSelection;
  }

  public boolean pasteOnMiddleMouseButton() {
    return myState.myPasteOnMiddleMouseButton;
  }

  public void setPasteOnMiddleMouseButton(boolean pasteOnMiddleMouseButton) {
    myState.myPasteOnMiddleMouseButton = pasteOnMiddleMouseButton;
  }

  @Override
  public void initComponent() {
  }

  @Override
  public void disposeComponent() {
  }

  @NotNull
  @Override
  public File[] getExportFiles() {
    return new File[]{new File(PathManager.getOptionsPath() + File.separatorChar + "terminal.xml")};
  }

  @NotNull
  @Override
  public String getPresentableName() {
    return "TerminalOptions";
  }

  @NotNull
  @Override
  public String getComponentName() {
    return "TerminalOptionsProvider";
  }
}

