class CopyJars extends DefaultTask {

    @InputFiles
    FileCollection source

    @OutputDirectory
    File destination

    @TaskAction
    void apply() {
        project.copy {
            from source
            into destination
        }
    }
}

class ExtractAars extends DefaultTask {

    @Input
    boolean extractJarsOnly = false

    @InputFiles
    FileCollection source

    @OutputDirectory
    File destination

    @TaskAction
    void apply() {
        source.each { File file ->
            def baseFilename = file.name.lastIndexOf('.').with {
                it != -1 ? file.name[0..< it] : file.name
            }

            if (extractJarsOnly) {
                project.copy {
                    from project.zipTree(file)
                    include 'classes.jar'
                    into destination.name
                    rename {
                        String fileName -> fileName.replace('classes.jar', baseFilename + '.jar')
                    }
                }
            } else {
                project.copy {
                    from project.zipTree(file)
                    exclude 'classes.jar'
                    into destination.absolutePath + File.separator + baseFilename
                }

                project.copy {
                    from project.zipTree(file)
                    include 'classes.jar'
                    into destination.absolutePath + File.separator + baseFilename +
                        File.separator + destination.name
                    rename {
                        String fileName -> fileName.replace('classes.jar', baseFilename + '.jar')
                    }
                }
            }
        }
    }
}

task ('copyJarDependenciesIntoLibs', type: CopyJars) {

    description = 'Used for Eclipse. Copies JAR dependencies to the libs directory.'

    destination = file(project.projectDir.canonicalPath + File.separator + 'src' + File.separator + 'main' + File.separator + 'libs')

    afterEvaluate {
        source = files(
            project.configurations.matching {
                it.name.endsWith 'Compile' or it.name == 'compile'
            }.each {
                logger.info "Adding dependencies from ${it.name} configuration."
            }
        ).filter {
            it.name.endsWith 'jar'
        }
        logger.info source.files.toString()
    }
}

task ('extractAarDependenciesIntoLibs', type: ExtractAars) {

    description = 'Used for Eclipse. Extracts AAR dependencies into the libs directory.'

    destination = file(project.projectDir.canonicalPath + File.separator + 'src' + File.separator + 'main' + File.separator + 'libs')

    afterEvaluate {
        source = files(
            project.configurations.matching {
                it.name.endsWith 'Compile' or it.name == 'compile'
            }.each {
                logger.info "Adding dependencies from ${it.name} configuration."
            }
        ).filter {
            it.name.endsWith 'aar'
        }
        logger.info source.files.toString()
    }
}

task copyDependenciesIntoLibs {
    dependsOn copyJarDependenciesIntoLibs, extractAarDependenciesIntoLibs
    description = 'Used for Eclipse. Copies JAR and extracts AAR dependencies into the libs ' +
        'directory.'
}