/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you 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.
 */

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_8'
                pRoot.'@project-jdk-name' = '1.8'

                // 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=" Licensed to the Apache Software Foundation (ASF) under one&#10; or more contributor license agreements.  See the NOTICE file&#10; distributed with this work for additional information&#10; regarding copyright ownership.  The ASF licenses this file&#10; to you under the Apache License, Version 2.0 (the&#10; &quot;License&quot;); you may not use this file except in compliance&#10; with the License.  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,&#10; software distributed under the License is distributed on an&#10; &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY&#10; KIND, either express or implied.  See the License for the&#10; specific language governing permissions and limitations&#10; under the License." />
                          <option name="keyword" value="Copyright" />
                          <option name="allowReplaceKeyword" value="" />
                          <option name="myName" value="ASL2" />
                          <option name="myLocal" value="true" />
                      </copyright>
                    ''')
                    appendNode(copyrightManager, '''
                        <LanguageOptions name="__TEMPLATE__">
                            <option name="addBlankAfter" value="false" />
                        </LanguageOptions>
                    ''')
                }

                def compilerConfig = node.component.find { it.@name == 'CompilerConfiguration' }
                ['/**/org.codehaus.groovy.runtime.ExtensionModule',
                '*.jar',
                'test-resources:/**/*.groovy','test-resources:/**/*.java',
                '!?*.groovy',
                '/groovy/inspect/swingui/AstBrowserProperties.groovy',
                '/groovy/inspect/swingui/AstBrowserProperties.groovy',
                '/**/org.codehaus.groovy.runtime.ExtensionModule;*.jar',
                '/groovy/inspect/swingui/AstBrowserProperties.groovy',
                '/**/org.codehaus.groovy.runtime.ExtensionModule',
                '*.jar'].each {
                    appendNode(compilerConfig.wildcardResourcePatterns[0], "<entry name=\"$it\" />")
                }
                appendNode(compilerConfig,'''<excludeFromCompile>
      <directory url="file://$PROJECT_DIR$/src/test-resources" includeSubdirectories="true" />
    </excludeFromCompile>''')
            }
        }
    }

    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)
    }
}
