// Copyright (C) 2022 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.gitrepometrics;

import com.google.common.flogger.FluentLogger;
import com.google.gerrit.server.config.GerritInstanceId;
import com.google.gerrit.server.events.Event;
import com.google.gerrit.server.events.EventListener;
import com.google.gerrit.server.events.ProjectEvent;
import com.google.gerrit.server.events.RefUpdatedEvent;
import com.google.inject.Inject;
import java.util.Objects;
import java.util.concurrent.ExecutorService;

class GitRepoUpdateListener implements EventListener {
  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
  private final ExecutorService executor;
  private final UpdateGitMetricsTask.Factory updateGitMetricsTaskFactory;
  private final GitRepoMetricsCache gitRepoMetricsCache;
  private final String instanceId;

  @Inject
  protected GitRepoUpdateListener(
      @GerritInstanceId String instanceId,
      @UpdateGitMetricsExecutor ExecutorService executor,
      UpdateGitMetricsTask.Factory updateGitMetricsTaskFactory,
      GitRepoMetricsCache gitRepoMetricsCache) {
    this.instanceId = instanceId;
    this.executor = executor;
    this.updateGitMetricsTaskFactory = updateGitMetricsTaskFactory;
    this.gitRepoMetricsCache = gitRepoMetricsCache;
  }

  @Override
  public void onEvent(Event event) {
    if (event instanceof RefUpdatedEvent || isReplicationDoneEvent(event)) {
      String projectName = ((ProjectEvent) event).getProjectNameKey().get();
      logger.atFine().log(
          "Got %s event from %s. Might need to collect metrics for project %s",
          event.type, event.instanceId, projectName);

      if (gitRepoMetricsCache.shouldCollectStats(projectName)) {
        UpdateGitMetricsTask updateGitMetricsTask = updateGitMetricsTaskFactory.create(projectName);
        executor.execute(updateGitMetricsTask);
      }
    }
  }

  private boolean isReplicationDoneEvent(Event event) {
    // Check the name of the event instead of checking the class type
    // to avoid importing pull and push replication plugin dependencies
    // only for this check.
    return event.type != null
        && !Objects.equals(event.instanceId, instanceId)
        && event.type.endsWith("-replication-done");
  }
}
