#!/usr/bin/env python3
#
# Copyright 2023 Google LLC
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""
This script writes the full path to the MacSDK that is being used
by the clang_mac toolchain for builds within this workspace. This
path is created by //toolchain/download_mac_toolchain.bzl when
downloading the mac toolchain, and the MacSDK directory is populated
with symlinks to XCode's MacSDK contents.
"""

import codecs
import hashlib
import os
import subprocess
import sys
from pathlib import Path


def GetWorkspaceDir() -> str:
    """Return the workspace directory containing this script."""
    this_script_path = Path(os.path.realpath(__file__))
    return str(this_script_path.parent.parent)


def GetBazelWorkspaceHash() -> str:
    """Return the Bazel hash for this workspace.

    This is the MD5 has of the full path to the workspace. See
    https://bazel.build/remote/output-directories#layout-diagram for more detail."""
    ws = GetWorkspaceDir().encode("utf-8")
    return hashlib.md5(ws).hexdigest()


def GetBazelRepositoryCacheDir() -> str:
    """Return the Bazel repository cache directory."""

    prev_cwd = os.getcwd()
    os.chdir(GetWorkspaceDir())
    cmd = ["bazelisk", "info", "repository_cache"]
    output = subprocess.check_output(cmd)
    decoded_output = codecs.decode(output, "utf-8")
    return decoded_output.strip()


def GetBazelOutputDir() -> str:
    """Return the Bazel output directory.

    This is described in https://bazel.build/remote/output-directories"""
    repo_cache_dir = Path(GetBazelRepositoryCacheDir())
    # The repository cache is inside the output directory, so going up
    # three levels returns the output directory.
    output_dir = repo_cache_dir.parent.parent.parent
    return str(output_dir)


def GetBazelWorkspaceCacheDir() -> str:
    """Determine the output directory cache for this workspace.

    Note: The Bazel docs(1) are very clear that the organization of the output
    directory may change at any time.

    (1) https://bazel.build/remote/output-directories
    """
    return os.path.join(GetBazelOutputDir(), GetBazelWorkspaceHash())


def GetMacSDKSymlinkDir() -> str:
    """Determine the MacSDK symlinks directory for this workspace."""
    return os.path.join(GetBazelWorkspaceCacheDir(), "external", "clang_mac", "symlinks", "xcode", "MacSDK")


if "__main__" == __name__:
    print(GetMacSDKSymlinkDir())
