import logging
from data.model import health
from app import build_logs, storage


logger = logging.getLogger(__name__)


def _check_registry_gunicorn(app):
  """ Returns the status of the registry gunicorn workers. """
  # Compute the URL for checking the registry endpoint. We append a port if and only if the
  # hostname contains one.
  client = app.config['HTTPCLIENT']
  hostname_parts = app.config['SERVER_HOSTNAME'].split(':')
  port = ''
  if len(hostname_parts) == 2:
    port = ':' + hostname_parts[1]

  scheme = app.config['PREFERRED_URL_SCHEME']
  if app.config.get('EXTERNAL_TLS_TERMINATION', False):
    scheme = 'http'

  registry_url = '%s://localhost%s/v1/_internal_ping' % (scheme, port)
  try:
    return client.get(registry_url, verify=False, timeout=2).status_code == 200
  except Exception:
    logger.exception('Exception when checking registry health: %s', registry_url)
    return False


def _check_database(app):
  """ Returns the status of the database, as accessed from this instance. """
  return health.check_health(app.config)

def _check_redis(app):
  """ Returns the status of Redis, as accessed from this instance. """
  return build_logs.check_health()

def _check_storage(app):
  """ Returns the status of storage, as accessed from this instance. """
  try:
    storage.validate(storage.preferred_locations, app.config['HTTPCLIENT'])
    return True
  except Exception as ex:
    logger.exception('Storage check failed with exception %s', ex)
    return False


_SERVICES = {
  'registry_gunicorn': _check_registry_gunicorn,
  'database': _check_database,
  'redis': _check_redis,
  'storage': _check_storage,
}

def check_all_services(app, skip):
  """ Returns a dictionary containing the status of all the services defined. """
  status = {}
  for name in _SERVICES:
    if name in skip:
      continue

    status[name] = _SERVICES[name](app)

  return status