#!/bin/bash
# Copyright 2018 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.

### run various checks to determine the health of a Fuchsia checkout

## usage: fx doctor

# The goal of this script is to detect common issues with a Fuchsia
# checkout and potential conflicts in the user's shell environment.
#
# For example, on OS X the xcode command line tool
# installation often lapses. Ensuring that `xcode select --install` is
# run as part of a checkout or build is problematic: the step involves
# manual input. Detecting that it needs to be run, however, is
# perfectly mechanizable.
#
# For potential issues in the user's shell initialization script
# (such as ~/.bashrc), this script will also run a shell checkup
# script (for example, devshell/lib/bashrc_checkup.sh)
# under the user's bash "${SHELL}" (if different from /bin/bash),
# load the user's shell settings, and check for any known issues.

source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?
source "${FUCHSIA_DIR}/scripts/devshell/lib/style.sh" || exit $?
source "${FUCHSIA_DIR}/scripts/devshell/lib/common_term_styles.sh" || exit $?

fx-config-read || exit $?

dr_mac() {
  local status=0
  local xcode_path=$(xcode-select --print-path)
  local expected_path='/Library/Developer/CommandLineTools'
  local required_subpath='usr/include/c++'

  if [[ ! -d "${xcode_path}/${required_subpath}" ]]; then
    if [[ "${xcode_path}" != "${expected_path}" ]] && \
       [[ -d "${expected_path}/${required_subpath}" ]]; then
      warn "You may need to run \`sudo xcode-select --switch \"${expected_path}\"\`"
    else
      warn "Make sure you've run \`sudo xcode-select --install\`"
    fi

    details << EOF
A common issue with Fuchsia development on macOS is needing to
re-run the \`xcode-select\` command. The typical symptom is
failure to find system C or C++ headers after a reboot or update.

If the XCode Command Line Tools are missing, install them with:

EOF
    code << EOF
sudo xcode-select --install
EOF
    details << EOF

If the XCode Command Line Tools are already installed, but XCode
is configured to use the wrong path (e.g., an Xcode application
directory, instead of the "CommandLineTools", which you can
verify with \`xcode-select --print-path\`) then you may need to
"switch" to the CommandLineTools, using:

EOF
    code << EOF
sudo xcode-select --switch "${expected_path}"
EOF
    details << EOF

See $(link 'https://fuchsia.googlesource.com/docs/getting_started.md#macos')
for more details.
EOF
  fi

  return ${status}
}

dr_linux() {
  local status=0
  return ${status}
}

shell_checkup() {
  local status=0

  # If the user is using bash, their default interactive "${SHELL}"
  # may differ from the script-standard "/bin/bash", and their ~/.bashrc
  # may depend on features of their shell that are not present in
  # /bin/bash, so launch the shell checkup script using "${SHELL}".
  #
  # For example, since MacOS includes only bash version 3, Homebrew users
  # may install bash 4 in /usr/local/bin/bash, and then select
  # bash 4 by adding it to /etc/shells, and running the "chsh" command.

  local shell_type="$(basename "${SHELL}")"
  case "${shell_type}" in
    bash)
      local current_debug_flag="$(echo $-|sed -n 's/.*x.*/-x/p')"
      eval "${SHELL}" "${current_debug_flag}" "${FUCHSIA_DIR}/scripts/devshell/lib/bashrc_checkup.sh" || status=$?
      ;;
    *)
      info "No shell checkup for ${shell_type}"
      ;;
  esac

  return ${status}
}

dr_all() {
  local status=0
  shell_checkup || status=$?
  return ${status}
}

main() {
  local status=0
  case $(uname) in
    Darwin)
      dr_mac || status=$?
      ;;
    Linux)
      dr_linux || status=$?
      ;;
  esac
  dr_all || status=$?
  if (( ${status} == 0 )); then
    info "No known issues were found. You appear to be in good health!"
  fi
  return ${status}
}

main "$@" || exit $?
