#!/usr/bin/env python2.7
# vim: set expandtab:ts=2:sw=2
# Copyright 2016 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import os
import platform
import re
import sys

SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__))
FUCHSIA_ROOT = os.path.abspath(os.path.join(SCRIPT_DIR, os.pardir, os.pardir))
MKBOOTFS_PATH = os.path.join(FUCHSIA_ROOT, 'out', 'build-zircon', 'tools', 'mkbootfs')
DEBUG_OUT_DIR = os.path.join(FUCHSIA_ROOT, 'out', 'debug-x64')
RELEASE_OUT_DIR = os.path.join(FUCHSIA_ROOT, 'out', 'release-x64')
PREBUILT_PATH = os.path.join(FUCHSIA_ROOT, 'prebuilt')

def get_os():
    return platform.system().lower().replace('darwin', 'mac')

def get_arch():
    return {
        'x86_64': 'x64',
        'aarch64': 'arm64',
    }[platform.machine()]

# Returns a string with format "<OS>-<ARCH>" (eg. linux-x64).
def get_platform():
    return '%s-%s' % (get_os(), get_arch())

def recursive_search(root, pattern):
  """Looks for a particular directory pattern within a directory tree.

  Ignores files and git directories.

  Returns:
    the containing directory of the match or None if not found.
  """

  search_queue = [root]
  while search_queue:
    # List the children.
    current_path = search_queue.pop(0)
    for child in os.listdir(current_path):
      full_path = os.path.join(current_path, child)
      # Ignore files.
      if not os.path.isdir(full_path):
        continue
      # Ignore git.
      if child == '.git':
        continue
      # See if we found it.
      if pattern in full_path:
        return full_path
      # Otherwise, enqueue the path for searching.
      search_queue.append(full_path)
  return None

# Returns the base clang path. Note that this is not the clang/lib/clang but rather the base
# directory in out prebuilt directories.
def search_clang_path(root):
  """clang can change location, so we search where it landed.

  For now there is only one clang integration, so this should always find the
  correct one.
  This could potentially look over a number of directories, but this will only
  be run once at YCM server startup, so it should not affect overall
  performance.

  Returns:
    clang path or None.
  """

  # This is the root where we should search for the clang installation.
  clang_path = recursive_search(root, 'clang/%s' % get_platform())
  if not clang_path:
    print('Could not find clang installation')
    return None

  return clang_path

def search_gn_path(root):
  gn_dir = recursive_search(PREBUILT_PATH, 'gn/%s' % get_platform())
  if not gn_dir:
    return gn_dir
  return os.path.join(gn_dir, 'gn')

def search_ninja_path(root):
  ninja_dir = recursive_search(PREBUILT_PATH, 'ninja/%s' % get_platform())
  if not ninja_dir:
    return ninja_dir
  return os.path.join(ninja_dir, 'ninja')

def get_rust_toolchain_path(root):
  return '%s/third_party/rust_tools/%s' % (root, get_platform())

# We start seaching from the correct buildtools.
CLANG_PATH = search_clang_path(PREBUILT_PATH)
GN_PATH = search_gn_path(PREBUILT_PATH)
NINJA_PATH = search_ninja_path(PREBUILT_PATH)
VSCODE_RUST_TOOLCHAIN = get_rust_toolchain_path(PREBUILT_PATH)

def main():
  variable_re = re.compile('^[A-Z][A-Z_]*$')
  def usage():
    print('Usage: path.py VARIABLE')
    print('Available variables:')
    print('\n'.join(filter(variable_re.match, globals().keys())))
  if len(sys.argv) != 2:
    usage()
    return
  variable = sys.argv[1]
  if not variable_re.match(variable) or variable not in globals().keys():
    usage()
    return
  print(globals()[variable])

if __name__ == '__main__':
  main()
