/*
 * Copyright 2000-2014 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 org.jetbrains.plugins.groovy.refactoring.introduce.field;


import com.intellij.openapi.application.WriteAction
import com.intellij.psi.JavaPsiFacade
import com.intellij.psi.PsiType
import com.intellij.psi.impl.source.PostprocessReformattingAspect
import org.jetbrains.annotations.NotNull
import org.jetbrains.annotations.Nullable
import org.jetbrains.plugins.groovy.LightGroovyTestCase
import org.jetbrains.plugins.groovy.util.TestUtils

import static org.jetbrains.plugins.groovy.refactoring.introduce.field.GrIntroduceFieldSettings.Init.*

/**
 * @author Maxim.Medvedev
 */
public class GrIntroduceFieldTest extends LightGroovyTestCase {
  @Override
  protected String getBasePath() {
    "${TestUtils.testDataPath}refactoring/introduceField/";
  }

  public void testSimple() {
    doTest(false, false, false, CUR_METHOD, false, null);
  }

  public void testDeclareFinal() {
    doTest(false, false, true, FIELD_DECLARATION, false, null);
  }

  public void testCreateConstructor() {
    doTest(false, false, true, CONSTRUCTOR, true, null);
  }

  public void testManyConstructors() {
    doTest(false, false, true, CONSTRUCTOR, true, null);
  }

  public void testDontReplaceStaticOccurrences() {
    doTest(false, false, true, FIELD_DECLARATION, true, null);
  }

  public void testQualifyUsages() {
    doTest(false, false, true, FIELD_DECLARATION, true, null);
  }

  public void testReplaceLocalVar() {
    doTest(false, true, false, CUR_METHOD, true, null);
  }

  public void testIntroduceLocalVarByDeclaration() {
    doTest(false, true, false, FIELD_DECLARATION, true, null);
  }

  public void testReplaceExpressionWithAssignment() {
    doTest(false, false, false, CUR_METHOD, false, null);
  }

  public void testAnonymousClass() {
    doTest(false, false, false, CUR_METHOD, false, null);
  }

  public void testAnonymous2() {
    doTest(false, false, false, CONSTRUCTOR, false, null);
  }

  public void testAnonymous3() {
    doTest(false, false, false, CONSTRUCTOR, false, null);
  }

  public void testInitializeInCurrentMethod() {
    doTest(false, true, true, CUR_METHOD, false, null);
  }

  public void testScriptBody() {
    addGroovyTransformField()
    doTest('''\
print <selection>'abc'</selection>
''', '''\
import groovy.transform.Field

@Field f = 'abc'
print f<caret>
''', false, false, false, FIELD_DECLARATION)
  }

  public void testScriptMethod() {
    addGroovyTransformField()
    doTest('''\
def foo() {
  print <selection>'abc'</selection>
}
''', '''\
import groovy.transform.Field

@Field final f = 'abc'

def foo() {
  print f<caret>
}
''', false, false, true, FIELD_DECLARATION)
  }

  public void testStaticScriptMethod() {
    addGroovyTransformField()
    doTest('''\
static def foo() {
  print <selection>'abc'</selection>
}
''', '''\
import groovy.transform.Field

@Field static f = 'abc'

static def foo() {
  print f<caret>
}
''', true, false, false, FIELD_DECLARATION)
  }

  public void testScriptMethod2() {
    addGroovyTransformField()
    doTest('''\
def foo() {
  print <selection>'abc'</selection>
}
''', '''\
import groovy.transform.Field

@Field f

def foo() {
    f = 'abc'
    print f<caret>
}
''', false, false, false, CUR_METHOD)
  }

  public void testSetUp1() throws Exception {
    addTestCase()
    doTest('''\
class MyTest extends GroovyTestCase {
    void foo() {
        print <selection>'ac'</selection>
    }
}
''', '''\
class MyTest extends GroovyTestCase {
    def f

    void foo() {
        print f<caret>
    }

    void setUp() {
        super.setUp()
        f = 'ac'
    }
}
''',
false, false, false, SETUP_METHOD)
  }

  public void testSetUp2() throws Exception {
    addTestCase()

    doTest('''\
class MyTest extends GroovyTestCase {
    void setUp() {
        super.setUp()
        def x = 'abc'
    }

    void foo() {
        print <selection>'ac'</selection>
    }
}
''', '''\
class MyTest extends GroovyTestCase {
    def f

    void setUp() {
        super.setUp()
        def x = 'abc'
    f = 'ac'
    }

    void foo() {
        print f<caret>
    }
}
''',
           false, false, false, SETUP_METHOD)
  }

  void testStringPart0() {
    doTest('''\
class A {
    def foo() {
        print 'a<selection>b</selection>c'
    }
}''', '''\
class A {
    def f = 'b'

    def foo() {
        print 'a' + f<caret> + 'c'
    }
}''', false, false, false, FIELD_DECLARATION, false, null)
  }

  void testStringPart1() {
    doTest('''\
class A {
    def foo() {
        print 'a<selection>b</selection>c'
    }
}''', '''\
class A {
    def f

    def foo() {
        f = 'b'
        print 'a' + f<caret> + 'c'
    }
}''', false, false, false, CUR_METHOD, false, null)
  }

  void testStringPart2() {
    doTest('''\
class A {
    def foo() {
        def f = 5
        print 'a<selection>b</selection>c'
    }
}''', '''\
class A {
    def f

    def foo() {
        def f = 5
        this.f = 'b'
        print 'a' + this.f<caret> + 'c'
    }
}''', false, false, false, CUR_METHOD, false, null)
  }

  void testGStringInjection() {
    doTest('''\
class GroovyLightProjectDescriptor  {
    public void configureModule() {
        print ("$<selection>mockGroovy2_1LibraryName</selection>!/");
    }

    def getMockGroovy2_1LibraryName() {''}
}
''', '''\
class GroovyLightProjectDescriptor  {
    def f

    public void configureModule() {
        f = mockGroovy2_1LibraryName
        print ("${f}!/");
    }

    def getMockGroovy2_1LibraryName() {''}
}
''', false, false, false, CUR_METHOD)
  }

  void testGStringInjection2() {
    doTest('''\
class GroovyLightProjectDescriptor  {
    public void configureModule() {
        print ("$<selection>mockGroovy2_1LibraryName</selection>.bytes!/");
    }

    def getMockGroovy2_1LibraryName() {''}
}
''', '''\
class GroovyLightProjectDescriptor  {
    def f

    public void configureModule() {
        f = mockGroovy2_1LibraryName
        print ("${f.bytes}!/");
    }

    def getMockGroovy2_1LibraryName() {''}
}
''', false, false, false, CUR_METHOD)
  }

  void testInitializeInMethodInThenBranch() {
    doTest('''\
class A {
    def foo() {
        if (abc) print <selection>2</selection>
    }
}
''', '''\
class A {
    def f

    def foo() {
        if (abc) {
            f = 2
            print f
        }
    }
}
''', false, false, false, CUR_METHOD, false, null)
  }

  void testFromVar() {
    doTest('''\
class A {
    def foo() {
        def <selection>a = 5</selection>
        print a
    }
}''', '''\
class A {
    def f = 5

    def foo() {
        print f
    }
}''', false, true, false, FIELD_DECLARATION, true, null)
  }


  private void doTest(final boolean isStatic,
                      final boolean removeLocal,
                      final boolean declareFinal,
                      @NotNull final GrIntroduceFieldSettings.Init initIn,
                      final boolean replaceAll = false,
                      @Nullable final String selectedType = null) {
    myFixture.configureByFile("${getTestName(false)}.groovy")
    performRefactoring(selectedType, isStatic, removeLocal, declareFinal, initIn, replaceAll)
    myFixture.checkResultByFile("${getTestName(false)}_after.groovy");
  }

  private void doTest(@NotNull final String textBefore,
                      @NotNull String textAfter,
                      final boolean isStatic,
                      final boolean removeLocal,
                      final boolean declareFinal,
                      @NotNull final GrIntroduceFieldSettings.Init initIn,
                      final boolean replaceAll = false,
                      @Nullable final String selectedType = null) {
    myFixture.configureByText("_.groovy", textBefore)
    performRefactoring(selectedType, isStatic, removeLocal, declareFinal, initIn, replaceAll)
    myFixture.checkResult(textAfter);
  }


  private void performRefactoring(String selectedType, boolean isStatic, boolean removeLocal, boolean declareFinal, GrIntroduceFieldSettings.Init initIn, boolean replaceAll) {
    final PsiType type = selectedType == null ? null : JavaPsiFacade.getElementFactory(project).createTypeFromText(selectedType, myFixture.file)
    def accessToken = WriteAction.start()
    try {
      final IntroduceFieldTestHandler handler = new IntroduceFieldTestHandler(isStatic, removeLocal, declareFinal, initIn, replaceAll, type)
      handler.invoke(project, myFixture.editor, myFixture.file, null);
      PostprocessReformattingAspect.getInstance(project).doPostponedFormatting();
    }
    finally {
      accessToken.finish()
    }
  }
}
