// Copyright (C) 2015 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.google.gerrit.metrics.dropwizard;

import com.google.gerrit.metrics.CallbackMetric0;

import com.codahale.metrics.MetricRegistry;

class CallbackMetricImpl0<V>
    extends CallbackMetric0<V>
    implements CallbackMetricGlue {
  @SuppressWarnings("unchecked")
  static <V> V zeroFor(Class<V> valueClass) {
    if (valueClass == Integer.class) {
      return (V) Integer.valueOf(0);
    } else if (valueClass == Long.class) {
      return (V) Long.valueOf(0);
    } else if (valueClass == Double.class) {
      return (V) Double.valueOf(0);
    } else if (valueClass == Float.class) {
      return (V) Float.valueOf(0);
    } else if (valueClass == String.class) {
      return (V) "";
    } else if (valueClass == Boolean.class) {
      return (V) Boolean.FALSE;
    } else {
      throw new IllegalArgumentException("unsupported value type "
          + valueClass.getName());
    }
  }

  private final DropWizardMetricMaker metrics;
  private final MetricRegistry registry;
  private final String name;
  private volatile V value;

  CallbackMetricImpl0(DropWizardMetricMaker metrics, MetricRegistry registry,
      String name, Class<V> valueType) {
    this.metrics = metrics;
    this.registry = registry;
    this.name = name;
    this.value = zeroFor(valueType);
  }

  @Override
  public void beginSet() {
  }

  @Override
  public void endSet() {
  }

  @Override
  public void set(V value) {
    this.value = value;
  }

  @Override
  public void remove() {
    metrics.remove(name);
    registry.remove(name);
  }

  @Override
  public void register(final Runnable trigger) {
    registry.register(name, new com.codahale.metrics.Gauge<V>() {
      @Override
      public V getValue() {
        trigger.run();
        return value;
      }
    });
  }
}
