# Copyright 2016 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Service manager to initialize all services."""
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import

from features import autolink
from services import cachemanager_svc
from services import chart_svc
from services import config_svc
from services import features_svc
from services import issue_svc
from services import project_svc
from services import spam_svc
from services import star_svc
from services import template_svc
from services import user_svc
from services import usergroup_svc


svcs = None


class Services(object):
  """A simple container for widely-used service objects."""

  def __init__(
      self, project=None, user=None, issue=None, config=None,
      usergroup=None, cache_manager=None, autolink_obj=None,
      user_star=None, project_star=None, issue_star=None, features=None,
      spam=None, hotlist_star=None, chart=None, template=None):
    # Persistence services
    self.project = project
    self.user = user
    self.usergroup = usergroup
    self.issue = issue
    self.config = config
    self.user_star = user_star
    self.project_star = project_star
    self.hotlist_star = hotlist_star
    self.issue_star = issue_star
    self.features = features
    self.template = template

    # Misc. services
    self.cache_manager = cache_manager
    self.autolink = autolink_obj
    self.spam = spam
    self.chart = chart


def set_up_services():
  """Set up all services."""

  global svcs
  if svcs is None:
    # Sorted as: cache_manager first, everything which depends on it,
    # issue (which depends on project and config), things with no deps.
    cache_manager = cachemanager_svc.CacheManager()
    config = config_svc.ConfigService(cache_manager)
    features = features_svc.FeaturesService(cache_manager, config)
    hotlist_star = star_svc.HotlistStarService(cache_manager)
    issue_star = star_svc.IssueStarService(cache_manager)
    project = project_svc.ProjectService(cache_manager)
    project_star = star_svc.ProjectStarService(cache_manager)
    user = user_svc.UserService(cache_manager)
    user_star = star_svc.UserStarService(cache_manager)
    usergroup = usergroup_svc.UserGroupService(cache_manager)
    chart = chart_svc.ChartService(config)
    issue = issue_svc.IssueService(project, config, cache_manager, chart)
    autolink_obj = autolink.Autolink()
    spam = spam_svc.SpamService()
    template = template_svc.TemplateService(cache_manager)
    svcs = Services(
      cache_manager=cache_manager, config=config, features=features,
      issue_star=issue_star, project=project, project_star=project_star,
      user=user, user_star=user_star, usergroup=usergroup, issue=issue,
      autolink_obj=autolink_obj, spam=spam, hotlist_star=hotlist_star,
      chart=chart, template=template)
  return svcs
