/*
 * Copyright 2000-2011 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.actions;

import com.intellij.CvsBundle;
import com.intellij.cvsSupport2.actions.cvsContext.CvsContext;
import com.intellij.cvsSupport2.config.CvsRootConfiguration;
import com.intellij.cvsSupport2.config.ui.SelectCvsConfigurationDialog;
import com.intellij.cvsSupport2.connections.CvsEnvironment;
import com.intellij.cvsSupport2.cvsBrowser.ui.BrowserPanel;
import com.intellij.cvsSupport2.cvshandlers.CvsHandler;
import com.intellij.cvsSupport2.cvshandlers.FileSetToBeUpdated;
import com.intellij.cvsSupport2.cvsoperations.common.LoginPerformer;
import com.intellij.cvsSupport2.ui.CvsTabbedWindow;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.actionSystem.Presentation;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.MessageType;
import com.intellij.openapi.vcs.VcsException;
import com.intellij.openapi.vcs.actions.VcsContext;
import com.intellij.openapi.vcs.ui.VcsBalloonProblemNotifier;
import com.intellij.util.Consumer;

import java.util.Collections;

/**
 * author: lesya
 */
public class BrowseCvsRepositoryAction extends AbstractAction implements DumbAware {
  private static final String TITLE = CvsBundle.message("operation.name.browse.repository");
  private CvsRootConfiguration mySelectedConfiguration;

  public BrowseCvsRepositoryAction() {
    super(false);
  }

  @Override
  public void update(AnActionEvent e) {
    final Presentation presentation = e.getPresentation();
    final boolean projectExists = e.getData(CommonDataKeys.PROJECT) != null;
    presentation.setVisible(projectExists);
    presentation.setEnabled(projectExists);
  }

  @Override
  protected String getTitle(VcsContext context) {
    return TITLE;
  }

  @Override
  protected CvsHandler getCvsHandler(CvsContext context) {
    final SelectCvsConfigurationDialog selectCvsConfigurationDialog = new SelectCvsConfigurationDialog(context.getProject());
    selectCvsConfigurationDialog.show();
    if (!selectCvsConfigurationDialog.isOK()) return CvsHandler.NULL;

    mySelectedConfiguration = selectCvsConfigurationDialog.getSelectedConfiguration();
    return new MyCvsHandler();
  }

  @Override
  protected void onActionPerformed(CvsContext context,
                                   CvsTabbedWindow tabbedWindow,
                                   boolean successfully,
                                   CvsHandler handler) {
    if (mySelectedConfiguration == null) return;
    final Project project = context.getProject();
    if (! loginImpl(context.getProject(),
                    new Consumer<VcsException>() {
                      @Override
                      public void consume(VcsException e) {
                        VcsBalloonProblemNotifier.showOverChangesView(project, e.getMessage(), MessageType.WARNING);
                      }
                    })) return;
    super.onActionPerformed(context, tabbedWindow, successfully, handler);
    if (successfully){
      LOG.assertTrue(project != null);
      LOG.assertTrue(mySelectedConfiguration != null);
      final BrowserPanel browserPanel = new BrowserPanel(mySelectedConfiguration, project, new Consumer<VcsException>() {
        @Override
        public void consume(VcsException e) {
          VcsBalloonProblemNotifier.showOverChangesView(project, e.getMessage(), MessageType.ERROR);
        }
      });
      tabbedWindow.addTab(TITLE, browserPanel,
                          true, true, true, true, browserPanel.getActionGroup(), "cvs.browse");
      tabbedWindow.ensureVisible(project);
    }
  }

  private class MyCvsHandler extends CvsHandler {

    public MyCvsHandler() {
      super(TITLE, FileSetToBeUpdated.EMPTY);
    }

    @Override
    public boolean isCanceled() {
      return false;
    }

    @Override
    protected int getFilesToProcessCount() {
      return 0;
    }

    @Override
    public boolean login(Project project) {
      return loginImpl(project, new Consumer<VcsException>() {
        public void consume(VcsException e) {
          myErrors.add(e);
        }
      });
    }
  }

  private boolean loginImpl(final Project project, final Consumer<VcsException> exceptionConsumer) {
    final LoginPerformer performer =
      new LoginPerformer(project, Collections.<CvsEnvironment>singletonList(mySelectedConfiguration), exceptionConsumer);
    try {
      return performer.loginAll(false);
    } catch (Exception e) {
      VcsBalloonProblemNotifier.showOverChangesView(project, e.getMessage(), MessageType.ERROR);
      return false;
    }
  }
}
