#!/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/fuchsia/+/master/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 $?
