import logging
import os
import features
import time

from app import app, userfiles as user_files, build_logs, dockerfile_build_queue

from buildman.manager.enterprise import EnterpriseManager
from buildman.server import BuilderServer

from trollius import SSLContext

logger = logging.getLogger(__name__)

BUILD_MANAGERS = {
  'enterprise': EnterpriseManager
}

EXTERNALLY_MANAGED = 'external'

def run_build_manager():
  if not features.BUILD_SUPPORT:
    logger.debug('Building is disabled. Please enable the feature flag')
    return

  build_manager_config = app.config.get('BUILD_MANAGER')
  if build_manager_config is None:
    return

  # If the build system is externally managed, then we just sleep this process.
  if build_manager_config[0] == EXTERNALLY_MANAGED:
    logger.debug('Builds are externally managed.')
    while True:
      time.sleep(1000)
    return

  logger.debug('Asking to start build manager with lifecycle "%s"', build_manager_config[0])
  manager_klass = BUILD_MANAGERS.get(build_manager_config[0])
  if manager_klass is None:
    return

  logger.debug('Starting build manager with lifecycle "%s"', build_manager_config[0])
  ssl_context = None
  if os.environ.get('SSL_CONFIG'):
    logger.debug('Loading SSL cert and key')
    ssl_context = SSLContext()
    ssl_context.load_cert_chain(os.path.join(os.environ.get('SSL_CONFIG'), 'ssl.cert'),
                                os.path.join(os.environ.get('SSL_CONFIG'), 'ssl.key'))

  server = BuilderServer(app.config['SERVER_HOSTNAME'], dockerfile_build_queue, build_logs,
                         user_files, manager_klass)
  server.run('0.0.0.0', ssl=ssl_context)

if __name__ == '__main__':
  logging.basicConfig(level=logging.DEBUG)
  run_build_manager()
