package org.jetbrains.idea.maven.dom;

import com.intellij.codeInsight.completion.CompletionType;
import com.intellij.codeInsight.lookup.LookupElement;

import java.io.IOException;
import java.util.Arrays;

/**
 * @author Sergey Evdokimov
 */
public class MavenDependencySmartCompletionTest extends MavenDomWithIndicesTestCase {

  public void testCompletion() throws IOException {
    createProjectPom("<groupId>test</groupId>" +
                     "<artifactId>project</artifactId>" +
                     "<version>1</version>" +

                     "<dependencies>" +
                     "  <dependency>" +
                     "    <caret>" +
                     "  </dependency>" +
                     "</dependencies>");

    assertCompletionVariantsInclude(myProjectPom, "junit:junit");
  }

  public void testInsertDependency() throws IOException {
    createProjectPom("<groupId>test</groupId>\n" +
                     "<artifactId>project</artifactId>\n" +
                     "<version>1</version>\n" +

                     "<dependencies>\n" +
                     "  <dependency>ju<caret></dependency>\n" +
                     "</dependencies>\n");

    configTest(myProjectPom);
    myFixture.complete(CompletionType.SMART);
    assertContain(myFixture.getLookupElementStrings(), "4.0", "3.8.2");

    myFixture.checkResult(createPomXml("<groupId>test</groupId>\n" +
                                       "<artifactId>project</artifactId>\n" +
                                       "<version>1</version>\n" +

                                       "<dependencies>\n" +
                                       "    <dependency>\n" +
                                       "        <groupId>junit</groupId>\n" +
                                       "        <artifactId>junit</artifactId>\n" +
                                       "        <version><caret></version>\n" +
                                       "    </dependency>\n" +
                                       "</dependencies>\n"));
  }

  public void testInsertManagedDependency() throws IOException {
    createProjectPom("<groupId>test</groupId>\n" +
                     "<artifactId>project</artifactId>\n" +
                     "<version>1</version>\n" +

                     "<dependencyManagement>\n" +
                     "  <dependencies>\n" +
                     "    <dependency>\n" +
                     "      <groupId>junit</groupId>\n" +
                     "      <artifactId>junit</artifactId>\n" +
                     "      <version>4.0</version>\n" +
                     "    </dependency>\n" +
                     "  </dependencies>\n" +
                     "</dependencyManagement>\n" +

                     "<dependencies>\n" +
                     "  <dependency>ju<caret></dependency>\n" +
                     "</dependencies>\n");

    configTest(myProjectPom);
    myFixture.complete(CompletionType.SMART);

    myFixture.checkResult(createPomXml("<groupId>test</groupId>\n" +
                                       "<artifactId>project</artifactId>\n" +
                                       "<version>1</version>\n" +
                                       "<dependencyManagement>\n" +
                                       "  <dependencies>\n" +
                                       "    <dependency>\n" +
                                       "      <groupId>junit</groupId>\n" +
                                       "      <artifactId>junit</artifactId>\n" +
                                       "      <version>4.0</version>\n" +
                                       "    </dependency>\n" +
                                       "  </dependencies>\n" +
                                       "</dependencyManagement>\n" +
                                       "<dependencies>\n" +
                                       "    <dependency>\n" +
                                       "        <groupId>junit</groupId>\n" +
                                       "        <artifactId>junit</artifactId>\n" +
                                       "    </dependency>\n" +
                                       "</dependencies>\n"));
  }

  public void testInsertManagedDependencyWithTypeAndClassifier() throws IOException {
    createProjectPom("<groupId>test</groupId>\n" +
                     "<artifactId>project</artifactId>\n" +
                     "<version>1</version>\n" +
                     "<properties>\n" +
                     "  <junitClassifier>sources</junitClassifier>\n" +
                     "  <junitType>test-jar</junitType>\n" +
                     "</properties>\n" +

                     "<dependencyManagement>\n" +
                     "  <dependencies>\n" +
                     "    <dependency>\n" +
                     "      <groupId>junit</groupId>\n" +
                     "      <artifactId>junit</artifactId>\n" +
                     "      <version>4.0</version>\n" +
                     "      <type>${junitType}</type>\n" +
                     "      <classifier>${junitClassifier}</classifier>\n" +
                     "    </dependency>\n" +
                     "  </dependencies>\n" +
                     "</dependencyManagement>\n" +

                     "<dependencies>\n" +
                     "  <dependency>ju<caret></dependency>\n" +
                     "</dependencies>\n");

    configTest(myProjectPom);
    myFixture.complete(CompletionType.SMART);

    myFixture.checkResult(createPomXml("<groupId>test</groupId>\n" +
                                       "<artifactId>project</artifactId>\n" +
                                       "<version>1</version>\n" +
                                       "<properties>\n" +
                                       "  <junitClassifier>sources</junitClassifier>\n" +
                                       "  <junitType>test-jar</junitType>\n" +
                                       "</properties>\n" +

                                       "<dependencyManagement>\n" +
                                       "  <dependencies>\n" +
                                       "    <dependency>\n" +
                                       "      <groupId>junit</groupId>\n" +
                                       "      <artifactId>junit</artifactId>\n" +
                                       "      <version>4.0</version>\n" +
                                       "      <type>${junitType}</type>\n" +
                                       "      <classifier>${junitClassifier}</classifier>\n" +
                                       "    </dependency>\n" +
                                       "  </dependencies>\n" +
                                       "</dependencyManagement>\n" +

                                       "<dependencies>\n" +
                                       "    <dependency>\n" +
                                       "        <groupId>junit</groupId>\n" +
                                       "        <artifactId>junit</artifactId>\n" +
                                       "        <type>${junitType}</type>\n" +
                                       "        <classifier>${junitClassifier}</classifier>\n" +
                                       "    </dependency>\n" +
                                       "</dependencies>\n"));
  }

  public void testCompletionArtifactIdThenVersion() throws IOException {
    importProject("<groupId>test</groupId>" +
                  "<artifactId>project</artifactId>" +
                  "<version>1</version>");

    createProjectPom("<groupId>test</groupId>" +
                     "<artifactId>project</artifactId>" +
                     "<version>1</version>\n" +

                     "<dependencies>\n" +
                     "  <dependency>\n" +
                     "    <artifactId>juni<caret></artifactId>\n" +
                     "  </dependency>\n" +
                     "</dependencies>\n");

    myFixture.configureFromExistingVirtualFile(myProjectPom);

    LookupElement[] elements = myFixture.completeBasic();
    assertSize(1, elements);

    myFixture.type('\n');

    myFixture.checkResult(createPomXml("<groupId>test</groupId>" +
                                       "<artifactId>project</artifactId>" +
                                       "<version>1</version>\n" +

                                       "<dependencies>\n" +
                                       "  <dependency>\n" +
                                       "      <groupId>junit</groupId>\n" +
                                       "      <artifactId>junit</artifactId>\n" +
                                       "      <version><caret></version>\n" +
                                       "  </dependency>\n" +
                                       "</dependencies>\n"));

    myFixture.getLookupElementStrings().containsAll(Arrays.asList("3.8.1", "4.0"));
  }

  public void testCompletionArtifactIdThenGroupIdThenInsertVersion() throws IOException {
    importProject("<groupId>test</groupId>" +
                  "<artifactId>project</artifactId>" +
                  "<version>1</version>");

    createProjectPom("<groupId>test</groupId>" +
                     "<artifactId>project</artifactId>" +
                     "<version>1</version>\n" +

                     "<dependencies>\n" +
                     "  <dependency>\n" +
                     "    <artifactId>as<caret></artifactId>\n" +
                     "  </dependency>\n" +
                     "</dependencies>\n");

    myFixture.configureFromExistingVirtualFile(myProjectPom);

    LookupElement[] elements = myFixture.completeBasic();
    assertSize(1, elements);

    myFixture.type('\n');

    assertUnorderedElementsAreEqual(myFixture.getLookupElementStrings(), "asm", "org.ow2.asm");

    myFixture.type("org\n");

    myFixture.checkResult(createPomXml("<groupId>test</groupId>" +
                                       "<artifactId>project</artifactId>" +
                                       "<version>1</version>\n" +

                                       "<dependencies>\n" +
                                       "  <dependency>\n" +
                                       "      <groupId>org.ow2.asm</groupId>\n" +
                                       "      <artifactId>asm</artifactId>\n" +
                                       "      <version>4.1</version>\n" +
                                       "  </dependency>\n" +
                                       "</dependencies>\n"));
  }

  public void testCompletionArtifactIdThenGroupIdThenCompleteVersion() throws IOException {
    importProject("<groupId>test</groupId>" +
                  "<artifactId>project</artifactId>" +
                  "<version>1</version>");

    createProjectPom("<groupId>test</groupId>" +
                     "<artifactId>project</artifactId>" +
                     "<version>1</version>\n" +

                     "<dependencies>\n" +
                     "  <dependency>\n" +
                     "    <artifactId>as<caret></artifactId>\n" +
                     "  </dependency>\n" +
                     "</dependencies>\n");

    myFixture.configureFromExistingVirtualFile(myProjectPom);

    LookupElement[] elements = myFixture.completeBasic();
    assertSize(1, elements);

    myFixture.type('\n');

    assertUnorderedElementsAreEqual(myFixture.getLookupElementStrings(), "asm", "org.ow2.asm");

    myFixture.type("asm\n");

    myFixture.checkResult(createPomXml("<groupId>test</groupId>" +
                                       "<artifactId>project</artifactId>" +
                                       "<version>1</version>\n" +

                                       "<dependencies>\n" +
                                       "  <dependency>\n" +
                                       "      <groupId>asm</groupId>\n" +
                                       "      <artifactId>asm</artifactId>\n" +
                                       "      <version><caret></version>\n" +
                                       "  </dependency>\n" +
                                       "</dependencies>\n"));

    myFixture.getLookupElementStrings().equals(Arrays.asList("3.3", "3.3.1"));
  }

  public void testCompletionArtifactIdWithFullInsert() throws IOException {
    importProject("<groupId>test</groupId>" +
                  "<artifactId>project</artifactId>" +
                  "<version>1</version>");

    createProjectPom("<groupId>test</groupId>" +
                     "<artifactId>project</artifactId>" +
                     "<version>1</version>\n" +

                     "<dependencies>\n" +
                     "  <dependency>\n" +
                     "    <artifactId>common-i<caret></artifactId>\n" +
                     "  </dependency>\n" +
                     "</dependencies>\n");

    myFixture.configureFromExistingVirtualFile(myProjectPom);

    LookupElement[] elements = myFixture.completeBasic();
    assertSize(1, elements);

    myFixture.type('\n');

    myFixture.checkResult(createPomXml("<groupId>test</groupId>" +
                                       "<artifactId>project</artifactId>" +
                                       "<version>1</version>\n" +

                                       "<dependencies>\n" +
                                       "  <dependency>\n" +
                                       "      <groupId>commons-io</groupId>\n" +
                                       "      <artifactId>commons-io</artifactId>\n" +
                                       "      <version>2.4</version>\n" +
                                       "  </dependency>\n" +
                                       "</dependencies>\n"));
  }

  public void testCompletionArtifactIdInsideManagedDependency() throws IOException {
    importProject("<groupId>test</groupId>" +
                  "<artifactId>project</artifactId>" +
                  "<version>1</version>");

    createProjectPom("<groupId>test</groupId>" +
                     "<artifactId>project</artifactId>" +
                     "<version>1</version>\n" +

                     "<dependencyManagement>\n" +
                     "    <dependencies>\n" +
                     "        <dependency>\n" +
                     "            <artifactId>commons-i<caret></artifactId>\n" +
                     "        </dependency>\n" +
                     "    </dependencies>\n" +
                     "</dependencyManagement>\n");

    myFixture.configureFromExistingVirtualFile(myProjectPom);

    LookupElement[] elements = myFixture.completeBasic();
    assertSize(1, elements);
    myFixture.type('\n');

    myFixture.checkResult(createPomXml("<groupId>test</groupId>" +
                                       "<artifactId>project</artifactId>" +
                                       "<version>1</version>\n" +

                                       "<dependencyManagement>\n" +
                                       "    <dependencies>\n" +
                                       "        <dependency>\n" +
                                       "            <groupId>commons-io</groupId>\n" +
                                       "            <artifactId>commons-io</artifactId>\n" +
                                       "            <version>2.4</version>\n" +
                                       "        </dependency>\n" +
                                       "    </dependencies>\n" +
                                       "</dependencyManagement>\n"));
  }

  public void testCompletionArtifactIdWithManagedDependency() throws IOException {
    importProject("<groupId>test</groupId>" +
                  "<artifactId>project</artifactId>" +
                  "<version>1</version>\n" +
                  "" +
                  "  <dependencyManagement>\n" +
                  "    <dependencies>\n" +
                  "      <dependency>\n" +
                  "        <groupId>commons-io</groupId>\n" +
                  "        <artifactId>commons-io</artifactId>\n" +
                  "        <version>2.4</version>\n" +
                  "      </dependency>\n" +
                  "    </dependencies>\n" +
                  "  </dependencyManagement>\n");

    createProjectPom("<groupId>test</groupId>" +
                     "<artifactId>project</artifactId>" +
                     "<version>1</version>\n" +
                     "  <dependencyManagement>\n" +
                     "    <dependencies>\n" +
                     "      <dependency>\n" +
                     "        <groupId>commons-io</groupId>\n" +
                     "        <artifactId>commons-io</artifactId>\n" +
                     "        <version>2.4</version>\n" +
                     "      </dependency>\n" +
                     "    </dependencies>\n" +
                     "  </dependencyManagement>\n" +

                     "<dependencies>\n" +
                     "  <dependency>\n" +
                     "    <artifactId>common-i<caret></artifactId>\n" +
                     "  </dependency>\n" +
                     "</dependencies>\n");

    myFixture.configureFromExistingVirtualFile(myProjectPom);

    LookupElement[] elements = myFixture.completeBasic();
    assertSize(1, elements);
    myFixture.type('\n');

    myFixture.checkResult(createPomXml("<groupId>test</groupId>" +
                                       "<artifactId>project</artifactId>" +
                                       "<version>1</version>\n" +

                                       "  <dependencyManagement>\n" +
                                       "    <dependencies>\n" +
                                       "      <dependency>\n" +
                                       "        <groupId>commons-io</groupId>\n" +
                                       "        <artifactId>commons-io</artifactId>\n" +
                                       "        <version>2.4</version>\n" +
                                       "      </dependency>\n" +
                                       "    </dependencies>\n" +
                                       "  </dependencyManagement>\n" +

                                       "<dependencies>\n" +
                                       "  <dependency>\n" +
                                       "      <groupId>commons-io</groupId>\n" +
                                       "      <artifactId>commons-io</artifactId>\n" +
                                       "  </dependency>\n" +
                                       "</dependencies>\n"
    ));
  }

  public void testCompletionGroupIdWithManagedDependencyWithTypeAndClassifier() throws IOException {
    importProject("<groupId>test</groupId>" +
                  "<artifactId>project</artifactId>" +
                  "<version>1</version>\n" +
                  "<properties>\n" +
                  "  <ioClassifier>ccc</ioClassifier>" +
                  "  <ioType>ttt</ioType>" +
                  "</properties>\n" +
                  "" +
                  "<dependencyManagement>\n" +
                  "  <dependencies>\n" +
                  "    <dependency>\n" +
                  "      <groupId>commons-io</groupId>\n" +
                  "      <artifactId>commons-io</artifactId>\n" +
                  "      <classifier>${ioClassifier}</classifier>\n" +
                  "      <type>${ioType}</type>\n" +
                  "      <version>2.4</version>\n" +
                  "    </dependency>\n" +
                  "  </dependencies>\n" +
                  "</dependencyManagement>\n");

    createProjectPom("<groupId>test</groupId>" +
                     "<artifactId>project</artifactId>" +
                     "<version>1</version>\n" +
                     "<dependencyManagement>\n" +
                     "  <dependencies>\n" +
                     "    <dependency>\n" +
                     "      <groupId>commons-io</groupId>\n" +
                     "      <artifactId>commons-io</artifactId>\n" +
                     "      <classifier>${ioClassifier}</classifier>\n" +
                     "      <type>${ioType}</type>\n" +
                     "      <version>2.4</version>\n" +
                     "    </dependency>\n" +
                     "  </dependencies>\n" +
                     "</dependencyManagement>\n" +

                     "<dependencies>\n" +
                     "  <dependency>\n" +
                     "      <groupId>commons-i<caret></groupId>\n" +
                     "      <artifactId>commons-io</artifactId>\n" +
                     "  </dependency>\n" +
                     "</dependencies>\n");

    myFixture.configureFromExistingVirtualFile(myProjectPom);

    LookupElement[] elements = myFixture.complete(CompletionType.SMART);
    assertNull(elements);
//    assertSize(1, elements);
//    myFixture.type('\n');

    myFixture.checkResult(createPomXml("<groupId>test</groupId>" +
                                       "<artifactId>project</artifactId>" +
                                       "<version>1</version>\n" +

                                       "<dependencyManagement>\n" +
                                       "  <dependencies>\n" +
                                       "    <dependency>\n" +
                                       "      <groupId>commons-io</groupId>\n" +
                                       "      <artifactId>commons-io</artifactId>\n" +
                                       "      <classifier>${ioClassifier}</classifier>\n" +
                                       "      <type>${ioType}</type>\n" +
                                       "      <version>2.4</version>\n" +
                                       "    </dependency>\n" +
                                       "  </dependencies>\n" +
                                       "</dependencyManagement>\n" +

                                       "<dependencies>\n" +
                                       "  <dependency>\n" +
                                       "      <groupId>commons-io</groupId>\n" +
                                       "      <artifactId>commons-io</artifactId>\n" +
                                       "      <type>${ioType}</type>\n" +
                                       "      <classifier>${ioClassifier}</classifier>\n" +
                                       "  </dependency>\n" +
                                       "</dependencies>\n"
    ));
  }

}
