# 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 defines

JDK_DIRS = os.path.join(defines.THIRD_PARTY, 'openjdk')
GRADLE_DAEMON_JVM_PROPERTIES = os.path.join(defines.REPO_ROOT, 'gradle',
                                            'gradle-daemon-jvm.properties')

ALL_JDKS = ['openjdk-9.0.4', 'jdk-11', 'jdk-17', 'jdk-21', 'jdk-25']

DEFAULT_JDK_HOME = None


# This JDK is used for everything except the compilation of the compiler.
def GetDefaultJdkHome():
    if DEFAULT_JDK_HOME is None:
        with open(GRADLE_DAEMON_JVM_PROPERTIES) as f:
            for line in f:
                line = line.strip()
                if line.startswith('toolchainVersion='):
                    version = line.split('=', 1)[1].strip()
                    return GetJdkHome(f'jdk-{version}')
        raise Exception('No toolchainVersion found in ' +
                        GRADLE_DAEMON_JVM_PROPERTIES)
    return DEFAULT_JDK_HOME


# This JDK is used for compilation and tasks related to compilation of the compiler.
def GetCompilationJdkHome():
    return GetJdk11Home()


def GetJdkHome(name):
    if name == 'jdk8':
        return GetJdk8Home()
    third_party_jdk_root = os.path.join(JDK_DIRS, name)
    if not os.path.exists(third_party_jdk_root):
        raise Exception('No JDKs found in ' + third_party_jdk_root)
    os_root = GetOSJavaHome(third_party_jdk_root)
    if not os.path.exists(os_root):
        raise Exception('No platform JDK found in ' + os_root)
    return os_root


def GetOSJavaHome(root):
    if defines.IsLinux():
        return os.path.join(root, 'linux')
    elif defines.IsOsX():
        return os.path.join(root, 'osx', 'Contents', 'Home')
    elif defines.IsWindows():
        return os.path.join(root, 'windows')
    else:
        raise Exception('Unsupported platform'
                        ' (not detected as either of Linux, macOS or Windows)')


def GetAllJdkDirs():
    dirs = []
    for jdk in ALL_JDKS:
        root = os.path.join(JDK_DIRS, jdk)
        if defines.IsLinux():
            root = os.path.join(root, 'linux')
        elif defines.IsOsX():
            root = os.path.join(root, 'osx')
        elif defines.IsWindows():
            root = os.path.join(root, 'windows')
        else:
            raise Exception(
                'Unsupported platform'
                ' (not detected as either of Linux, macOS or Windows)')
        # 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 GetJdk21Home():
    return GetJdkHome('jdk-21')


def GetJdk17Home():
    return GetJdkHome('jdk-17')


def GetJdk11Home():
    return GetJdkHome('jdk-11')


def GetJdk9Home():
    return GetJdkHome('openjdk-9.0.4')


def GetJdk8Home():
    root = os.path.join(JDK_DIRS, '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):
    executable = 'java.exe' if defines.IsWindows() else 'java'
    return os.path.join(jdkHome, 'bin', executable)


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


def GetJstackExecutable(jdkHome):
    executable = 'jstack.exe' if defines.IsWindows() else 'jstack'
    return os.path.join(jdkHome, 'bin', executable)
