/*
 * 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.openapi.vcs.roots;

import com.intellij.openapi.util.Condition;
import com.intellij.openapi.vcs.VcsDirectoryMapping;
import com.intellij.openapi.vcs.VcsRootError;
import com.intellij.openapi.vcs.VcsRootErrorImpl;
import com.intellij.openapi.vcs.VcsTestUtil;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;


/**
 * @author Nadya Zabrodina
 */
public class VcsRootErrorsFinderTest extends VcsRootPlatformTest {

  static final String PROJECT = VcsDirectoryMapping.PROJECT_CONSTANT;

  @Override
  public void setUp() throws Exception {
    super.setUp();
  }

  public void testNoRootsThenNoErrors() throws IOException {
    doTest(new VcsRootConfiguration());
  }

  public void testSameOneRootInBothThenNoErrors() throws IOException {
    VcsRootConfiguration vcsRootConfiguration =
      new VcsRootConfiguration().mock(".")
        .roots(".");
    doTest(vcsRootConfiguration);
  }

  public void testSameTwoRootsInBothThenNoErrors() throws IOException {
    VcsRootConfiguration vcsRootConfiguration =
      new VcsRootConfiguration().mock(".", "community")
        .roots(".", "community");
    doTest(vcsRootConfiguration);
  }

  public void testOneMockRootNoVCSRootsThenError() throws IOException {
    VcsRootConfiguration vcsRootConfiguration =
      new VcsRootConfiguration().mock(".")
        .unregErrors(".");
    doTest(vcsRootConfiguration);
  }

  public void testOneVCSRootNoMockRootsThenError() throws IOException {

    VcsRootConfiguration vcsRootConfiguration =
      new VcsRootConfiguration().roots(".")
        .extraErrors(".");
    doTest(vcsRootConfiguration);
  }


  public void testOneRootButDifferentThenTwoErrors() throws IOException {
    VcsRootConfiguration vcsRootConfiguration =
      new VcsRootConfiguration().mock(".")
        .roots("community")
        .unregErrors(".").extraErrors("community");
    doTest(vcsRootConfiguration);
  }

  public void testTwoRootsOneMatchingOneDifferentThenTwoErrors() throws IOException {
    VcsRootConfiguration vcsRootConfiguration =
      new VcsRootConfiguration().mock(".", "community")
        .roots(".", "contrib")
        .unregErrors("community").extraErrors("contrib");
    doTest(vcsRootConfiguration);
  }

  public void testTwoRootsInMockRootOneMatchingInVCSThenError() throws IOException {
    VcsRootConfiguration vcsRootConfiguration =
      new VcsRootConfiguration().mock(".", "community")
        .roots(".")
        .unregErrors("community");
    doTest(vcsRootConfiguration);
  }

  public void testTwoRootsBothNotMatchingThenFourErrors() throws IOException {
    VcsRootConfiguration vcsRootConfiguration =
      new VcsRootConfiguration().mock(".", "community")
        .roots("another", "contrib")
        .unregErrors("community", ".").extraErrors("contrib", "another");
    doTest(vcsRootConfiguration);
  }

  public void testProjectRootNoMockRootsThenErrorAboutExtraRoot() throws IOException {
    VcsRootConfiguration vcsRootConfiguration =
      new VcsRootConfiguration()
        .roots(PROJECT)
        .extraErrors(PROJECT);
    doTest(vcsRootConfiguration);
  }

  public void testProjectRootFullUnderMockRootThenCorrect() throws IOException {
    VcsRootConfiguration vcsRootConfiguration =
      new VcsRootConfiguration().mock(".")
        .roots(PROJECT);
    doTest(vcsRootConfiguration);
  }

  public void testProjectRootMockRootForAContentRootBelowProjectThenError() throws IOException {
    VcsRootConfiguration vcsRootConfiguration =
      new VcsRootConfiguration().mock("content_root")
        .contentRoots("content_root").roots(PROJECT)
        .unregErrors("content_root").extraErrors(PROJECT);
    doTest(vcsRootConfiguration);
  }

  public void testProjectRootMockRootBelowProjectFolderNotInAContentRootThenUnregisteredRootError() throws IOException {
    // this is to be fixed: auto-detection of MockRoot repositories in subfolders for the <Project> mapping
    VcsRootConfiguration vcsRootConfiguration =
      new VcsRootConfiguration().mock("community")
        .contentRoots(".").roots(PROJECT)
        .unregErrors("community").extraErrors(PROJECT);
    doTest(vcsRootConfiguration);
  }

  public void testProjectRootMockRootForFullProjectContentRootLinkedSourceFolderBelowProjectThenErrors() throws IOException {
    VcsRootConfiguration vcsRootConfiguration =
      new VcsRootConfiguration().mock(".", "content_root", "../linked_source_root", "folder")
        .roots(PROJECT)
        .contentRoots(".", "content_root", "../linked_source_root")
        .unregErrors("content_root", "../linked_source_root", "folder");
    doTest(vcsRootConfiguration);
  }

  public void testProjectRootForFolderMockRootForFullProjectContentRootLinkedSourceFolderBelowProjectThenErrors() throws IOException {
    VcsRootConfiguration vcsRootConfiguration =
      new VcsRootConfiguration().mock(".", "content_root", "../linked_source_root", "folder")
        .roots(PROJECT, "folder")
        .contentRoots(".", "content_root", "../linked_source_root")
        .unregErrors("content_root", "../linked_source_root");
    doTest(vcsRootConfiguration);
  }

  public void testProjectRootMockRootLikeInIDEAProjectThenError() throws IOException {
    VcsRootConfiguration vcsRootConfiguration =
      new VcsRootConfiguration().mock(".", "community", "contrib").roots(PROJECT)
        .contentRoots(".", "community", "contrib").unregErrors("community", "contrib");
    doTest(vcsRootConfiguration);
  }

  public void testRealMockRootRootDeeperThanThreeLevelsShouldBeDetected() throws IOException {
    VcsRootConfiguration vcsRootConfiguration =
      new VcsRootConfiguration().mock(".", "community", "contrib", "community/level1/level2/level3")
        .contentRoots(".", "community", "contrib").roots(PROJECT, "community/level1/level2/level3")
        .unregErrors("community", "contrib");
    doTest(vcsRootConfiguration);
  }

  private void doTest(@NotNull VcsRootConfiguration vcsRootConfiguration) throws IOException {
    initProject(vcsRootConfiguration);
    addVcsRoots(vcsRootConfiguration.getRoots());

    Collection<VcsRootError> expected = new ArrayList<VcsRootError>();
    expected.addAll(unregAll(vcsRootConfiguration.getUnregErrors()));
    expected.addAll(extraAll(vcsRootConfiguration.getExtraErrors()));
    Collection<VcsRootError> actual = ContainerUtil.filter(new VcsRootErrorsFinder(myProject).find(), new Condition<VcsRootError>() {
      @Override
      public boolean value(VcsRootError error) {
        return error.getVcsKey().equals(myVcs.getKeyInstanceMethod());
      }
    });
    VcsTestUtil.assertEqualCollections(actual, expected);
  }

  void addVcsRoots(@NotNull Collection<String> relativeRoots) {
    for (String root : relativeRoots) {
      if (root.equals(PROJECT)) {
        myVcsManager.setDirectoryMapping("", myVcsName);
      }
      else {
        String absoluteRoot = VcsTestUtil.toAbsolute(root, myProject);
        myVcsManager.setDirectoryMapping(absoluteRoot, myVcsName);
      }
    }
  }

  @NotNull
  Collection<VcsRootError> unregAll(@NotNull Collection<String> paths) {
    Collection<VcsRootError> unregRoots = new ArrayList<VcsRootError>();
    for (String path : paths) {
      unregRoots.add(unreg(path));
    }
    return unregRoots;
  }

  @NotNull
  Collection<VcsRootError> extraAll(@NotNull Collection<String> paths) {
    Collection<VcsRootError> extraRoots = new ArrayList<VcsRootError>();
    for (String path : paths) {
      extraRoots.add(extra(path));
    }
    return extraRoots;
  }

  @NotNull
  VcsRootError unreg(@NotNull String path) {
    return new VcsRootErrorImpl(VcsRootError.Type.UNREGISTERED_ROOT, VcsTestUtil.toAbsolute(path, myProject), myVcsName);
  }

  @NotNull
  VcsRootError extra(@NotNull String path) {
    return new VcsRootErrorImpl(VcsRootError.Type.EXTRA_MAPPING, PROJECT.equals(path) ? PROJECT : VcsTestUtil.toAbsolute(path, myProject),
                                myVcsName);
  }
}
