// Copyright (C) 2021 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.healthcheck.check;

import static com.googlesource.gerrit.plugins.healthcheck.check.HealthCheckNames.BLOCKEDTHREADS;

import com.google.common.base.Strings;
import com.google.gerrit.metrics.Counter0;
import com.google.gerrit.metrics.MetricMaker;
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
import com.googlesource.gerrit.plugins.healthcheck.HealthCheckMetrics;
import com.googlesource.gerrit.plugins.healthcheck.check.HealthCheck.Result;
import java.lang.management.ThreadInfo;
import java.util.function.Supplier;

class BlockedThreadsSubCheck
    implements BlockedThreadsCheck.CollectorProvider<BlockedThreadsSubCheck.SubCheckCollector> {
  interface Factory {
    BlockedThreadsSubCheck create(String prefix, Integer threshold);
  }

  static class SubCheckCollector extends BlockedThreadsCheck.Collector {
    private final String prefix;
    private final Counter0 failureCounterMetric;

    SubCheckCollector(String prefix, Integer threshold, Counter0 failureCounterMetric) {
      super(threshold);
      this.prefix = prefix;
      this.failureCounterMetric = failureCounterMetric;
    }

    @Override
    void collect(ThreadInfo info) {
      String threadName = info.getThreadName();
      if (!Strings.isNullOrEmpty(threadName) && threadName.startsWith(prefix)) {
        total += 1;
        if (Thread.State.BLOCKED == info.getThreadState()) {
          blocked += 1;
        }
      }
    }

    @Override
    void check() {
      super.check();
      if (Result.FAILED == result) {
        failureCounterMetric.increment();
      }
    }
  }

  private final Supplier<SubCheckCollector> collector;

  @Inject
  BlockedThreadsSubCheck(
      MetricMaker metricMaker, @Assisted String prefix, @Assisted Integer threshold) {
    HealthCheckMetrics healthCheckMetrics =
        new HealthCheckMetrics(
            metricMaker,
            String.format(
                "%s-%s", BLOCKEDTHREADS, prefix.toLowerCase().replaceAll("[^\\w-/]", "_")));
    Counter0 failureCounterMetric = healthCheckMetrics.getFailureCounterMetric();
    this.collector = () -> new SubCheckCollector(prefix, threshold, failureCounterMetric);
  }

  @Override
  public SubCheckCollector get() {
    return collector.get();
  }
}
