#!/usr/bin/env python3
# Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.

import os
import sys

import defines

JDK_DIR = os.path.join(defines.THIRD_PARTY, 'openjdk')

ALL_JDKS = ['openjdk-9.0.4', 'jdk-11', 'jdk-15', 'jdk-16', 'jdk-17',
            'jdk-18', 'jdk-21']


def GetJdkHome():
    return GetJdk11Home()


def GetJdkRoot():
    return GetJdk11Root()


def GetJdk11Root():
    root = os.path.join(JDK_DIR, 'jdk-11')
    os_root = GetOSPath(root)
    return os_root if os_root else os.environ['JAVA_HOME']


def GetOSPath(root):
    if defines.IsLinux():
        return os.path.join(root, 'linux')
    elif defines.IsOsX():
        return os.path.join(root, 'osx')
    elif defines.IsWindows():
        return os.path.join(root, 'windows')
    else:
        return None


def GetAllJdkDirs():
    dirs = []
    for jdk in ALL_JDKS:
        root = GetOSPath(os.path.join(JDK_DIR, jdk))
        # Some jdks are not available on windows, don't try to get these.
        if os.path.exists(root + '.tar.gz.sha1'):
            dirs.append(root)
    return dirs


def GetJdk11Home():
    root = GetJdk11Root()
    # osx has the home inside Contents/Home in the bundle
    if defines.IsOsX():
        return os.path.join(root, 'Contents', 'Home')
    else:
        return root


def GetJdk9Home():
    root = os.path.join(JDK_DIR, 'openjdk-9.0.4')
    if defines.IsLinux():
        return os.path.join(root, 'linux')
    elif defines.IsOsX():
        return os.path.join(root, 'osx')
    elif defines.IsWindows():
        return os.path.join(root, 'windows')
    else:
        return os.environ['JAVA_HOME']


def GetJdk8Home():
    root = os.path.join(JDK_DIR, 'jdk8')
    if defines.IsLinux():
        return os.path.join(root, 'linux-x86')
    elif defines.IsOsX():
        return os.path.join(root, 'darwin-x86')
    else:
        return os.environ['JAVA_HOME']


def GetJavaExecutable(jdkHome=None):
    jdkHome = jdkHome if jdkHome else GetJdkHome()
    executable = 'java.exe' if defines.IsWindows() else 'java'
    return os.path.join(jdkHome, 'bin', executable) if jdkHome else executable


def GetJavacExecutable(jdkHome=None):
    jdkHome = jdkHome if jdkHome else GetJdkHome()
    executable = 'javac.exe' if defines.IsWindows() else 'javac'
    return os.path.join(jdkHome, 'bin', executable) if jdkHome else executable


def Main():
    print(GetJdkHome())


if __name__ == '__main__':
    sys.exit(Main())
