#!/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', 'jdk-22']


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