/**
 * Configuration for gradle idea.
 *
 * Inspired from the Gradle build.
 */

def appendNode(node, text) {
    node.append(new XmlParser().parseText(text))
}

allprojects {
    apply plugin: 'idea'

    idea {
        module.iml.withXml { provider ->
            def node = provider.asNode()

            // remove target classes from libraries
            def moduleRoot = node.component.find { it.'@name' == 'NewModuleRootManager' }
            def entries = moduleRoot.orderEntry.findAll { oe ->
                oe.library.CLASSES.root.'@url' =~ /target/
            }
            if (entries) {
                entries.each { moduleRoot.remove(it) }
            }
        }
    }
}

idea {

    project {

        ipr {
            withXml { provider ->
                def node = provider.asNode()

                // jdk, language level fix
                def pRoot = node.component.find { it.'@name' == 'ProjectRootManager' }
                pRoot.'@languageLevel' = 'JDK_1_5'
                pRoot.'@project-jdk-name' = '1.7'

                // Use git
                def vcsConfig = node.component.find { it.'@name' == 'VcsDirectoryMappings' }
                vcsConfig.mapping[0].'@vcs' = 'Git'

                // license header
                def copyrightManager = node.component.find { it.'@name' == 'CopyrightManager' }
                copyrightManager.@default = "ASL2"
                def aslCopyright = copyrightManager.copyright.find { it.option.find { it.@name == "myName" }?.@value == "ASL2" }
                if (aslCopyright == null) {
                    appendNode(copyrightManager, '''
                      <copyright>
                          <option name="notice" value="Copyright 2003-$today.year the original author or authors.&#10;&#10;Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);&#10;you may not use this file except in compliance with the License.&#10;You may obtain a copy of the License at&#10;&#10;     http://www.apache.org/licenses/LICENSE-2.0&#10;&#10;Unless required by applicable law or agreed to in writing, software&#10;distributed under the License is distributed on an &quot;AS IS&quot; BASIS,&#10;WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&#10;See the License for the specific language governing permissions and&#10;limitations under the License." />
                          <option name="keyword" value="Copyright" />
                          <option name="allowReplaceKeyword" value="" />
                          <option name="myName" value="ASL2" />
                          <option name="myLocal" value="true" />
                      </copyright>
                ''')
                }

                def compilerConfig = node.component.find { it.@name == 'CompilerConfiguration' }
                ['/groovy/inspect/swingui/AstBrowserProperties.groovy',
                '/**/org.codehaus.groovy.runtime.ExtensionModule',
                '*.jar'].each {
                    appendNode(compilerConfig.wildcardResourcePatterns[0], "<entry name=\"$it\" />")
                }
            }
        }
    }

    workspace {
        iws {
            withXml { provider ->
                def node = provider.asNode()

                // exclude some files from stub generation
                def groovyCompilerConfig = node.component.find { it.'@name' == 'GroovyCompilerConfiguration' }
                if (!groovyCompilerConfig) {
                    node.append(new XmlParser().parseText('''
                   <component name='GroovyCompilerConfiguration'>
                      <excludes></excludes>
                   </component>'''))
                    groovyCompilerConfig = node.component.find { it.'@name' == 'GroovyCompilerConfiguration' }
                }
                def excludeNode = groovyCompilerConfig.excludes[0]
                ['/src/test/org/codehaus/groovy/transform/DelegateTransformTest.groovy',
                '/src/test/groovy/bugs/Groovy593_Bug.groovy'].each { excludedFile ->
                    def url = "file://\$PROJECT_DIR\$$excludedFile"
                    if (!excludeNode.file.any { it.'@url' == url }) {
                        excludeNode.append(new XmlParser().parseText("<file url=\"$url\" />"))
                    }
                }

                // add sample configurations
                def runmanager = node.component.find { it.'@name' == 'RunManager' }
                appendNode(runmanager, '''<configuration default="false" name="Console" type="Application" factoryName="Application">
      <extension name="coverage" enabled="false" merge="false" runner="idea">
        <pattern>
          <option name="PATTERN" value="groovy.ui.*" />
          <option name="ENABLED" value="true" />
        </pattern>
      </extension>
      <option name="MAIN_CLASS_NAME" value="groovy.ui.Console" />
      <option name="VM_PARAMETERS" />
      <option name="PROGRAM_PARAMETERS" />
      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
      <option name="ALTERNATIVE_JRE_PATH" />
      <option name="ENABLE_SWING_INSPECTOR" value="false" />
      <option name="ENV_VARIABLES" />
      <option name="PASS_PARENT_ENVS" value="true" />
      <module name="groovy-console" />
      <envs />
      <RunnerSettings RunnerId="Debug">
        <option name="DEBUG_PORT" value="" />
        <option name="TRANSPORT" value="0" />
        <option name="LOCAL" value="true" />
      </RunnerSettings>
      <RunnerSettings RunnerId="Profile ">
        <option name="myExternalizedOptions" />
      </RunnerSettings>
      <RunnerSettings RunnerId="Run" />
      <ConfigurationWrapper RunnerId="Debug" />
      <ConfigurationWrapper RunnerId="Run" />
      <method />
    </configuration>
''')
                appendNode(runmanager,'''<configuration default="false" name="groovy.transform.stc in groovy" type="JUnit" factoryName="JUnit">
      <extension name="coverage" enabled="false" merge="false" runner="idea">
        <pattern>
          <option name="PATTERN" value="groovy.transform.stc.*" />
          <option name="ENABLED" value="true" />
        </pattern>
      </extension>
      <module name="groovy" />
      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
      <option name="ALTERNATIVE_JRE_PATH" />
      <option name="PACKAGE_NAME" value="groovy.transform.stc" />
      <option name="MAIN_CLASS_NAME" />
      <option name="METHOD_NAME" />
      <option name="TEST_OBJECT" value="package" />
      <option name="VM_PARAMETERS" />
      <option name="PARAMETERS" />
      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
      <option name="ENV_VARIABLES" />
      <option name="PASS_PARENT_ENVS" value="true" />
      <option name="TEST_SEARCH_SCOPE">
        <value defaultName="moduleWithDependencies" />
      </option>
      <envs />
      <patterns />
      <RunnerSettings RunnerId="Debug">
        <option name="DEBUG_PORT" value="" />
        <option name="TRANSPORT" value="0" />
        <option name="LOCAL" value="true" />
      </RunnerSettings>
      <RunnerSettings RunnerId="Profile ">
        <option name="myExternalizedOptions" />
      </RunnerSettings>
      <RunnerSettings RunnerId="Run" />
      <ConfigurationWrapper RunnerId="Debug" />
      <ConfigurationWrapper RunnerId="Run" />
      <method />
    </configuration>
''')
            }
        }
    }

    module.iml.withXml { provider ->
        def node = provider.asNode()

        // remove compiler classes from libraries
        def moduleRoot = node.component.find { it.'@name' == 'NewModuleRootManager' }
        def entry = moduleRoot.orderEntry.find { oe ->
            oe.library.CLASSES.root.'@url' =~ /classes\/compiler/
        }
        if (entry) {
            moduleRoot.remove(entry)
        }

        // add an entry for groovy jar
        appendNode(moduleRoot, """
            <orderEntry type="module-library" exported="">
              <library>
                <CLASSES>
                  <root url="jar://${rootProject.jar.archivePath}!/"/>
                </CLASSES>
              </library>
            </orderEntry>
        """)
    }

    tasks.withType(GenerateIdeaProject).all {
        it.dependsOn(jar)
    }
}