/*
 * 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.cvsoperations.cvsImport;

import com.intellij.cvsSupport2.connections.CvsEnvironment;
import com.intellij.cvsSupport2.connections.CvsRootProvider;
import com.intellij.cvsSupport2.cvsoperations.common.CvsOperation;
import com.intellij.cvsSupport2.ui.experts.importToCvs.FileExtension;
import com.intellij.openapi.util.io.FileUtil;
import org.jetbrains.annotations.NotNull;
import org.netbeans.lib.cvsclient.command.importcmd.ImportCommand;
import org.netbeans.lib.cvsclient.util.IIgnoreFileFilter;

import java.io.File;
import java.util.Collection;

/**
 * author: lesya
 */

public class ImportDetails {
  private final File myBaseImportDirectory;
  private final String myVendor;
  private final String myReleaseTag;
  private final String myLogMessage;
  private final String myModuleName;
  private final CvsEnvironment myEnvironment;
  private final Collection<FileExtension> myWrappers;
  private final IIgnoreFileFilter myIgnoreFileFilter;

  public ImportDetails(@NotNull File baseImportDirectory,
                       String vendor,
                       String releaseTag,
                       String logMessage,
                       String moduleName,
                       CvsEnvironment env,
                       Collection<FileExtension> wrappers,
                       IIgnoreFileFilter ignoreFileFilter) {
    myBaseImportDirectory = baseImportDirectory;
    myVendor = vendor;
    myReleaseTag = releaseTag;
    myLogMessage = logMessage;
    myModuleName = moduleName;
    myEnvironment = env;
    myWrappers = wrappers;
    myIgnoreFileFilter = ignoreFileFilter;
  }

  public void prepareCommand(ImportCommand result) {
    result.setVendorTag(myVendor);
    result.setReleaseTag(myReleaseTag);
    result.setModule(getModulePath());
    result.setLogMessage(myLogMessage);

    for (final FileExtension fileExtension : myWrappers) {
      result.addWrapper("*." + fileExtension.getExtension(), fileExtension.getKeywordSubstitution().getSubstitution());
    }
  }

  public int getTotalFilesInSourceDirectory() {
    return CvsOperation.calculateFilesIn(myBaseImportDirectory);
  }

  private String getModulePath() {
    final String relativePath = FileUtil.getRelativePath(myBaseImportDirectory.getAbsoluteFile().getParentFile(),
                                                         myBaseImportDirectory.getAbsoluteFile());
    return replaceBaseImportDirectoryNameToModuleNameIn(relativePath);
  }

  public String getModuleName() {
    return myModuleName;
  }

  private String replaceBaseImportDirectoryNameToModuleNameIn(String relativePath) {
    return myModuleName + relativePath.substring(myBaseImportDirectory.getName().length());
  }

  public File getBaseImportDirectory() {
    return myBaseImportDirectory;
  }

  public CvsRootProvider getCvsRoot() {
    return CvsRootProvider.createOn(myBaseImportDirectory, myEnvironment);
  }

  public IIgnoreFileFilter getIgnoreFileFilter() {
    return myIgnoreFileFilter;
  }
}
