buildscript {
  repositories {
    jcenter()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:0.+'
  }
}

apply plugin: 'com.android.application'
apply plugin: 'cpp'
apply plugin: 'objective-cpp'

buildDir temporaryDirectory

def gtestBasePath = '../../../../external/gtest/'
def gmockBasePath = '../../../../external/gmock/'

android {
  compileSdkVersion 20
  buildToolsVersion '20.0.0'
  defaultConfig.targetSdkVersion 20

  sourceSets.main {
    manifest.srcFile 'android/AndroidManifest.xml'
    jniLibs.srcDir temporaryDirectory+'/libs/replayd'
    jni.srcDirs = []
  }

  buildTypes {
    release {
      debuggable false
      jniDebuggable false
      minifyEnabled false
      zipAlignEnabled true
    }
    debug {
      debuggable true
      jniDebuggable true
      zipAlignEnabled true
    }
  }
}

task ndkBuild(type: Exec) {
  def cmd = 'ndk-build' + (osFamily() == 'windows' ? '.cmd' : '')
  commandLine cmd, '-C', file('android').absolutePath, 'NDK_OUT='+temporaryDirectory+'/obj',
              'NDK_APP_DST_DIR='+temporaryDirectory+'/libs/replayd/$(TARGET_ARCH_ABI)', '-s', '-j'
}

task ndkClean(type: Exec) {
  def cmd = 'ndk-build' + (osFamily() == 'windows' ? '.cmd' : '')
  commandLine cmd, '-C', file('android').absolutePath, 'NDK_OUT='+temporaryDirectory+'/obj',
              'NDK_APP_DST_DIR='+temporaryDirectory+'/libs/replayd/$(TARGET_ARCH_ABI)', '-s', 'clean'
}

tasks.withType(JavaCompile) { compileTask ->
  compileTask.dependsOn ndkBuild
}

clean.dependsOn ndkClean

task runTests(type: Exec, dependsOn: nativePlatform()+'TestExecutable') {
  workingDir goPath
  commandLine temporaryDirectory+'/binaries/testExecutable/'+nativePlatform()+'/test'
}

model {
  platforms {
    linux64 {
      operatingSystem 'linux'
      architecture 'x86_64'
    }
    osx64 {
      operatingSystem 'osx'
      architecture 'x86_64'
    }
    windows64 {
      operatingSystem 'windows'
      architecture 'x86_64'
    }
  }
  toolChains {
    switch (osFamily()) {
      case 'mac':
        clang(Clang) {
          target('osx64') {
            cppCompiler.withArguments { it << '-DTARGET_OS_OSX' }
            objcppCompiler.withArguments { it << '-DTARGET_OS_OSX' }
          }
        }
        break

      case 'linux':
        gcc(Gcc) {
          target('linux64') {
            cppCompiler.withArguments { it << '-DTARGET_OS_LINUX' }
          }
          target('windows64') {
            cppCompiler.withArguments { it << '-DTARGET_OS_WINDOWS' }
            cppCompiler.withArguments { it << '-I'+mingwRoot()+'/include' }
            cppCompiler.executable 'x86_64-w64-mingw32-g++'
            cCompiler.executable 'x86_64-w64-mingw32-gcc'
            linker.executable 'x86_64-w64-mingw32-g++'
            assembler.executable 'x86_64-w64-mingw32-as'
            staticLibArchiver.executable 'x86_64-w64-mingw32-ar'
          }
        }
        break

      case 'windows':
        gcc(Gcc) {
          target('windows64') {
            cppCompiler.withArguments { it << '-DTARGET_OS_WINDOWS' }
            cppCompiler.executable 'g++'
            cCompiler.executable 'gcc'
            linker.executable 'g++'
            assembler.executable 'as'
            staticLibArchiver.executable 'ar'
          }
        }
        break
    }
  }
}

libraries {
  gtest {
    binaries.all {
      cppCompiler.args '-I', file(gtestBasePath).absolutePath, '-I', file(gtestBasePath+'include').absolutePath
    }
  }

  gmock {
    binaries.all {
      cppCompiler.args '-I', file(gmockBasePath).absolutePath, '-I', file(gmockBasePath+'include').absolutePath, '-I', file(gtestBasePath+'include').absolutePath
    }
  }

  caze {
    binaries.all {
      cppCompiler.args '-std=c++11', '-I/usr/local/include', '-O3'
    }
  }
}

executables {
  replayd {
    binaries.all {
      cppCompiler.args '-std=c++11', '-I/usr/local/include', '-O3'
      lib libraries.caze.static
      linker.args(*cazeLinkerArgs(targetPlatform.name))
    }
  }

  test {
    binaries.all {
      cppCompiler.args '-std=c++11', '-I', file(gtestBasePath+'include').absolutePath, '-I', file(gmockBasePath+'include').absolutePath, '-I', '/usr/local/include', '-g'
      lib libraries.caze.static
      lib libraries.gtest.static
      lib libraries.gmock.static
      linker.args(*cazeLinkerArgs(targetPlatform.name))
    }
  }
}

sources {
  gtest {
    cpp {
      source {
        srcDir gtestBasePath+'src'
        include 'gtest-all.cc'
        include 'gtest_main.cc'
      }
    }
  }

  gmock {
    cpp {
      source {
        srcDir gmockBasePath+'src'
        include 'gmock-all.cc'
      }
    }
  }

  caze {
    cpp {
      source {
        srcDir 'src'
        include '**/*.cpp'
        exclude '**/Main.cpp'
      }
      exportedHeaders {
        srcDirs 'src'
      }
    }
    objcpp {
      switch (osFamily()) {
      case 'mac':
        source {
          srcDir 'src'
          include '**/*.mm'
        }
      }
    }
  }

  test {
    cpp {
      source {
        srcDir 'test'
        include '**/*.cpp'
      }
    }
  }

  replayd {
    cpp {
      source {
        srcDir 'src'
        include '**/Main.cpp'
      }
    }
  }
}

task buildAndroid(dependsOn: ['assembleDebug', 'assembleRelease']) {
}

task buildLocal(dependsOn: [nativePlatform()+'TestExecutable', nativePlatform()+'ReplaydExecutable']) {
}

task installLocal(type: Copy, dependsOn: 'buildLocal') {
  from (temporaryDirectory+'/binaries/replaydExecutable/'+nativePlatform()) {
    include 'replayd*'
  }
  from (temporaryDirectory+'/binaries/testExecutable/'+nativePlatform()) {
    include 'test*'
    rename 'test(.*)', 'testReplayd$1'
  }
  into outputDirectory
}

task windows64installLocal(type: Copy, dependsOn: ['windows64TestExecutable', 'windows64ReplaydExecutable']) {
  if (nativePlatform() != 'windows64') {
    from (temporaryDirectory+'/binaries/replaydExecutable/windows64') {
      include 'replayd*'
    }
    from (temporaryDirectory+'/binaries/testExecutable/windows64') {
      include 'test*'
      rename 'test(.*)', 'testReplayd$1'
    }
  }
  into mingwRoot()+'/bin/'
}

def cazeLinkerArgs(targetPlatformName) {
  switch (targetPlatformName) {
    case 'linux64': return [
      '-ldl',
      '-lGL',
      '-lstdc++',
      '-lm',
      '-lpthread',
      '-lX11',
    ]
    case 'osx64': return [
      '-framework', 'Cocoa',
      '-framework', 'OpenGL',
      '-lstdc++',
      '-lpthread',
      '-L/usr/local/lib'
    ]
    case 'windows64': return [
      '-static-libgcc',
      '-static-libstdc++',
      '-L/usr/local/lib',
      '-L'+mingwRoot()+'/lib',
      '-lws2_32',
      '-lopengl32',
      '-lgdi32'
    ]
  }
}

def mingwRoot() {
  return System.getenv('MINGW_ROOT') ?: '/usr/local/mingw-root'
}
