/*
 * Copyright 2000-2009 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.impl;

import com.intellij.CvsBundle;
import com.intellij.cvsSupport2.config.CvsApplicationLevelConfiguration;
import com.intellij.cvsSupport2.config.CvsRootConfiguration;
import com.intellij.cvsSupport2.config.DateOrRevisionSettings;
import com.intellij.cvsSupport2.connections.CvsConnectionSettings;
import com.intellij.cvsSupport2.connections.IDEARootFormatter;
import com.intellij.cvsSupport2.connections.pserver.PServerLoginProvider;
import com.intellij.cvsSupport2.cvsExecution.CvsOperationExecutor;
import com.intellij.cvsSupport2.cvsExecution.CvsOperationExecutorCallback;
import com.intellij.cvsSupport2.cvshandlers.CommandCvsHandler;
import com.intellij.cvsSupport2.cvsoperations.cvsCheckOut.CheckoutProjectOperation;
import com.intellij.cvsSupport2.cvsoperations.cvsContent.GetFileContentOperation;
import com.intellij.cvsSupport2.cvsoperations.dateOrRevision.RevisionOrDate;
import com.intellij.cvsSupport2.cvsoperations.dateOrRevision.RevisionOrDateImpl;
import com.intellij.cvsSupport2.cvsoperations.dateOrRevision.SimpleRevision;
import com.intellij.cvsSupport2.history.ComparableVcsRevisionOnOperation;
import com.intellij.openapi.cvsIntegration.CvsModule;
import com.intellij.openapi.cvsIntegration.CvsRepository;
import com.intellij.openapi.cvsIntegration.CvsResult;
import com.intellij.openapi.cvsIntegration.CvsServices;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.fileEditor.OpenFileDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vcs.AbstractVcsHelper;
import com.intellij.openapi.vcs.vfs.VcsFileSystem;
import com.intellij.openapi.vcs.vfs.VcsVirtualFile;
import org.netbeans.lib.cvsclient.command.KeywordSubstitution;

import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * author: lesya
 */
public class CvsServicesImpl extends CvsServices {

  private static final Logger LOG = Logger.getInstance("#com.intellij.cvsSupport2.impl.CvsServicesImpl");

  public CvsModule[] chooseModules(Project project,
                                   boolean allowRootSelection,
                                   boolean allowMultipleSelection,
                                   boolean allowFilesSelection, String title, String selectModulePageTitle) {
    ModuleChooser moduleChooser = new ModuleChooser(project,
                                                    allowFilesSelection,
                                                    allowMultipleSelection,
                                                    allowRootSelection,
                                                    title,
                                                    selectModulePageTitle);
    moduleChooser.show();

    if (!moduleChooser.isOK()) return null;

    return moduleChooser.getSelectedModules();
  }

  public CvsRepository[] getConfiguredRepositories() {
    List<CvsRootConfiguration> configurations = CvsApplicationLevelConfiguration.getInstance().CONFIGURATIONS;
    CvsRepository[] result = new CvsRepository[configurations.size()];
    for (int i = 0; i < configurations.size(); i++) {
      result[i] = configurations.get(i).createCvsRepository();
    }
    return result;
  }

  private static ComparableVcsRevisionOnOperation createCvsVersionOn(CvsModule module, Project project) {
    final CvsRootConfiguration rootConfiguration = CvsApplicationLevelConfiguration.getInstance()
      .getConfigurationForCvsRoot(module.getRepository().getStringRepresentation());
    CvsConnectionSettings env = new IDEARootFormatter(rootConfiguration).createConfiguration();

    GetFileContentOperation operation =
      new GetFileContentOperation(new File(module.getPathInCvs()),
                                  env, new SimpleRevision(module.getRevision()));

    return new ComparableVcsRevisionOnOperation(operation, project);

  }

  public void showDifferencesForFiles(CvsModule first, CvsModule second, Project project) throws Exception {
    AbstractVcsHelper.getInstance(project).showDifferences(
      createCvsVersionOn(first, project),
      createCvsVersionOn(second, project),
      new File(first.getPathInCvs()));
  }

  public String getScrambledPasswordForPServerCvsRoot(String cvsRoot) {
    return PServerLoginProvider.getInstance()
      .getScrambledPasswordForCvsRoot(cvsRoot);
  }

  public boolean saveRepository(CvsRepository repository) {
    CvsApplicationLevelConfiguration configuration = CvsApplicationLevelConfiguration.getInstance();
    CvsRootConfiguration config = CvsRootConfiguration.createOn(repository);
    if (configuration.CONFIGURATIONS.contains(config)) return false;
    configuration.CONFIGURATIONS.add(config);
    return configuration.CONFIGURATIONS.contains(config);
  }

  public void openInEditor(Project project, CvsModule cvsFile) {
    CvsRepository repository = cvsFile.getRepository();
    RevisionOrDate revisionOrDate = RevisionOrDateImpl.createOn(new DateOrRevisionSettings().updateFrom(repository.getDateOrRevision()));

    GetFileContentOperation operation = new GetFileContentOperation(new File(cvsFile.getPathInCvs()),
                                                                    CvsRootConfiguration.createOn(repository),
                                                                    revisionOrDate
    );

    ComparableVcsRevisionOnOperation revision = new ComparableVcsRevisionOnOperation(operation,
                                                                                     project);

    VcsVirtualFile vcsVirtualFile = new VcsVirtualFile(cvsFile.getPathInCvs(),
                                                       revision,
                                                       VcsFileSystem.getInstance());
    OpenFileDescriptor openFileDescriptor = new OpenFileDescriptor(project, vcsVirtualFile);
    FileEditorManager.getInstance(project).openTextEditor(openFileDescriptor, false);
  }

  public byte[] getFileContent(Project project, CvsModule cvsFile) throws IOException {
    final GetFileContentOperation operation = new GetFileContentOperation(new File(cvsFile.getPathInCvs()),
                                                                          CvsRootConfiguration.createOn(cvsFile.getRepository()),
                                                                          new SimpleRevision(cvsFile.getRevision())
    );

    final CvsOperationExecutor executor = new CvsOperationExecutor(project);
    executor.performActionSync(new CommandCvsHandler(CvsBundle.message("operation.name.load.file.content"), operation, false),
                               CvsOperationExecutorCallback.EMPTY);

    if (!executor.hasNoErrors()) throw new RuntimeException(executor.getFirstError());
    if (operation.isDeleted()) throw new IOException(CvsBundle.message("exception.text.revision.has.been.deleted"));
    return operation.getFileBytes();
  }

  public CvsResult checkout(String[] modules,
                            File checkoutTo,
                            String directory,
                            boolean makeNewFilesReadOnly,
                            boolean pruneEmptyDirectories,
                            Object keywordSubstitution,
                            Project project,
                            CvsRepository repository) {
    LOG.assertTrue(modules.length > 0);
    CheckoutProjectOperation operation = new CheckoutProjectOperation(modules,
                                                                      CvsRootConfiguration.createOn(repository),
                                                                      makeNewFilesReadOnly,
                                                                      checkoutTo,
                                                                      directory,
                                                                      pruneEmptyDirectories,
                                                                      (KeywordSubstitution)keywordSubstitution);
    final CvsOperationExecutor executor = new CvsOperationExecutor(project);
    executor.performActionSync(new CommandCvsHandler(CvsBundle.message("operation.name.checkout"), operation, true),
                               CvsOperationExecutorCallback.EMPTY);
    return executor.getResult();
  }

}
