/*
 * 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 com.intellij.cvsSupport2.connections.ext.ui;

import com.intellij.CvsBundle;
import com.intellij.cvsSupport2.config.ExtConfiguration;
import com.intellij.cvsSupport2.config.SshSettings;
import com.intellij.cvsSupport2.connections.ssh.ui.SshConnectionSettingsPanel;
import com.intellij.cvsSupport2.ui.CvsRootChangeListener;
import com.intellij.openapi.project.Project;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NonNls;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Collection;

public class ExtConnectionDualPanel {

  private final ExtConnectionSettingsPanel myExtSettingsPanel;
  private final SshConnectionSettingsPanel mySshSettingsPanel;

  private final Collection<CvsRootChangeListener> myCvsRootChangeListeners = ContainerUtil.createLockFreeCopyOnWriteList();

  private final JPanel myPanel = new JPanel(new BorderLayout());
  private final JPanel myDualPanel = new JPanel(new CardLayout());
  private final JCheckBox myUseInternalImplementationCheckBox = new JCheckBox(CvsBundle.message("checkbox.text.use.internal.ssh.implementation"));
  @NonNls private static final String EXT = "EXT";
  @NonNls private static final String SSH = "SSH";

  public ExtConnectionDualPanel(Project project) {
    myExtSettingsPanel = new ExtConnectionSettingsPanel(project);
    mySshSettingsPanel = new SshConnectionSettingsPanel(project);

    myDualPanel.add(myExtSettingsPanel.getPanel(), EXT);
    myDualPanel.add(mySshSettingsPanel.getPanel(), SSH);

    myPanel.add(myUseInternalImplementationCheckBox, BorderLayout.NORTH);
    myPanel.add(myDualPanel, BorderLayout.CENTER);

    myUseInternalImplementationCheckBox.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        updatePage();
        notifyListeners();
      }
    });
  }

  public void addCvsRootChangeListener(CvsRootChangeListener l) {
    myCvsRootChangeListeners.add(l);
  }

  private void notifyListeners() {
    for (CvsRootChangeListener cvsRootChangeListener : myCvsRootChangeListeners) {
      cvsRootChangeListener.onCvsRootChanged();
    }
  }

  private void updatePage() {
    final CardLayout cardLayout = (CardLayout)myDualPanel.getLayout();
    if (myUseInternalImplementationCheckBox.isSelected()){
      cardLayout.show(myDualPanel, SSH);
    } else {
      cardLayout.show(myDualPanel, EXT);
    }
  }

  public JPanel getPanel() {
    return myPanel;
  }

  public void updateFrom(ExtConfiguration extConfiguration, SshSettings sshSettings) {
    myExtSettingsPanel.updateFrom(extConfiguration);
    mySshSettingsPanel.updateFrom(sshSettings);
    myUseInternalImplementationCheckBox.setSelected(extConfiguration.USE_INTERNAL_SSH_IMPLEMENTATION);
    updatePage();
  }

  public boolean equalsTo(ExtConfiguration extConfiguration, SshSettings sshSettings) {
    if (!myExtSettingsPanel.equalsTo(extConfiguration)) {
      return false;
    }
    if (!mySshSettingsPanel.equalsTo(sshSettings)) {
      return false;
    }
    return myUseInternalImplementationCheckBox.isSelected() == extConfiguration.USE_INTERNAL_SSH_IMPLEMENTATION;
  }

  public void saveTo(ExtConfiguration extConfiguration, SshSettings sshSettings) {
    myExtSettingsPanel.saveTo(extConfiguration);
    mySshSettingsPanel.saveTo(sshSettings);
    extConfiguration.USE_INTERNAL_SSH_IMPLEMENTATION = myUseInternalImplementationCheckBox.isSelected();
  }

  public boolean isUseInternalSshImplementation() {
    return myUseInternalImplementationCheckBox.isSelected();
  }
}
