// Copyright (C) 2014 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.googlesource.gerrit.plugins.gitblit;

import com.gitblit.manager.IAuthenticationManager;
import com.gitblit.manager.IGitblit;
import com.gitblit.manager.INotificationManager;
import com.gitblit.manager.IProjectManager;
import com.gitblit.manager.IRepositoryManager;
import com.gitblit.manager.IRuntimeManager;
import com.gitblit.manager.IUserManager;
import com.gitblit.servlet.GitblitContext;
import com.google.gerrit.server.config.SitePaths;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import javax.servlet.ServletContext;

@Singleton
class GerritGitBlitContext extends GitblitContext {
  private final SitePaths sitePaths;
  private final IRuntimeManager runtime;
  private final INotificationManager notificationManager;
  private final IUserManager userManager;
  private final IAuthenticationManager authenticationManager;
  private final IRepositoryManager repositoryManager;
  private final IProjectManager projectManager;
  private final IGitblit gitblit;

  @Inject
  GerritGitBlitContext(
      SitePaths sitePaths,
      IRuntimeManager runtime,
      INotificationManager notificationManager,
      IUserManager userManager,
      IAuthenticationManager authenticationManager,
      IRepositoryManager repositoryManager,
      IProjectManager projectManager,
      IGitblit gitblit) {
    this.sitePaths = sitePaths;
    this.runtime = runtime;
    this.notificationManager = notificationManager;
    this.userManager = userManager;
    this.authenticationManager = authenticationManager;
    this.repositoryManager = repositoryManager;
    this.projectManager = projectManager;
    this.gitblit = gitblit;
  }

  void init(ServletContext context) {
    // Manually configure IRuntimeManager
    runtime.setBaseFolder(sitePaths.site_path.toFile());
    runtime.getStatus().servletContainer = context.getServerInfo();
    runtime.start();

    // start all other managers
    startManager(notificationManager);
    startManager(userManager);
    startManager(authenticationManager);
    startManager(repositoryManager);
    startManager(projectManager);
    startManager(gitblit);

    logger.info("All Gitblit managers started.");
  }
}
