// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// To use, run:
//  $  gradle updateDependencies
//
// This script downloads the embedding dependencies into a lib/ directory,
// extract jar files from AARs, so they can be used in gn.
buildscript {
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:3.5.0"
    }
}

plugins {
    id "com.github.hierynomus.license-report" version "0.16.1"
}

def destinationDir = "lib"

allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

apply plugin: "com.android.application"

android {
  compileSdkVersion 34
}

configurations {
  embedding
}

println project.buildDir

// Configure the embedding dependencies.
// NB: '../../androidx/configure.gradle' is expected to resolve to the path
// 'src/flutter/tools/androidx', and '../../..' is expected to resolve to the
// path 'src/flutter'.
apply from: new File(rootDir, '../../androidx/configure.gradle').absolutePath;
configureEmbedderDependencies(new File(rootDir, '../../..')) { dependency ->
  dependencies {
     embedding "$dependency"
  }
}

task updateDependencies() {
  delete destinationDir
  // Copy the dependencies from the compileOnly configuration into
  // the destination directory.
  copy {
    from configurations.embedding
    into destinationDir
  }
  doLast {
    // Extract classes.jar from aar and rename it as the dependency name .jar
    // since javac doesn't support AARs.
    fileTree(destinationDir)
      .filter { it.name.endsWith(".aar") }
      .collect { aarDependency ->
        def dependencyName = "${aarDependency.name.take(aarDependency.name.lastIndexOf('.'))}";
        copy {
          into destinationDir
          from(zipTree(aarDependency)) {
            include "classes.jar"
          }
          rename "classes.jar", "${dependencyName}.jar"
        }
        delete aarDependency
      }
  }
  doLast {
    fileTree(destinationDir)
      .collect { dependency ->
        println "\"//third_party/robolectric/lib/${dependency.name}\","
      }
  }
}

downloadLicenses {
  ext.apacheTwo = license(
    'The Apache License, Version 2.0',
    'http://www.apache.org/licenses/LICENSE-2.0.txt',
  )
  aliases = [
    (apacheTwo) : [
      'The Apache Software License, Version 2.0',
      'Apache 2',
      'Apache License Version 2.0',
      'Apache License, Version 2.0',
      'Apache License 2.0',
      license('Apache License', 'http://www.apache.org/licenses/LICENSE-2.0'),
      license('Apache License, Version 2.0', 'http://opensource.org/licenses/Apache-2.0'),
    ],
  ]
  dependencyConfiguration = 'embedding'
}
