// Copyright (C) 2017 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.ericsson.gerrit.plugins.highavailability.peers.jgroups;

import org.jgroups.logging.Log;
import org.slf4j.Logger;

/**
 * A {@link Log} implementation which forwards all calls to the JGroups specific logging interface
 * to an instance of a SLF4J {@link Logger}. Only {@link #setLevel(String)} and {@link #getLevel()}
 * have no counterparts in SLF4J and are implemented as NOPs. Instances of this class are created by
 * {@link SLF4JLogFactory}. See the documentation of {@link SLF4JLogFactory} on how to configure
 * JGroups to use this class.
 *
 * @author christian.halstrick@sap.com
 */
public class SLF4JLog implements Log {
  private final Logger logger;

  public SLF4JLog(Logger log) {
    this.logger = log;
  }

  @Override
  public boolean isFatalEnabled() {
    return logger.isErrorEnabled();
  }

  @Override
  public boolean isErrorEnabled() {
    return logger.isErrorEnabled();
  }

  @Override
  public boolean isWarnEnabled() {
    return logger.isWarnEnabled();
  }

  @Override
  public boolean isInfoEnabled() {
    return logger.isInfoEnabled();
  }

  @Override
  public boolean isDebugEnabled() {
    return logger.isDebugEnabled();
  }

  @Override
  public boolean isTraceEnabled() {
    return logger.isTraceEnabled();
  }

  @Override
  public void fatal(String msg) {
    logger.error(msg);
  }

  @Override
  public void fatal(String msg, Object... args) {
    logger.error(convMsg(msg, args));
  }

  @Override
  public void fatal(String msg, Throwable throwable) {
    logger.error(msg, throwable);
  }

  @Override
  public void error(String msg) {
    logger.error(msg);
  }

  @Override
  public void error(String format, Object... args) {
    if (isErrorEnabled()) {
      logger.error(convMsg(format, args));
    }
  }

  @Override
  public void error(String msg, Throwable throwable) {
    logger.error(msg, throwable);
  }

  @Override
  public void warn(String msg) {
    logger.warn(msg);
  }

  @Override
  public void warn(String msg, Object... args) {
    if (isWarnEnabled()) {
      logger.warn(convMsg(msg, args));
    }
  }

  @Override
  public void warn(String msg, Throwable throwable) {
    logger.warn(msg, throwable);
  }

  @Override
  public void info(String msg) {
    logger.info(msg);
  }

  @Override
  public void info(String msg, Object... args) {
    if (isInfoEnabled()) {
      logger.info(convMsg(msg, args));
    }
  }

  @Override
  public void debug(String msg) {
    logger.info(msg);
  }

  @Override
  public void debug(String msg, Object... args) {
    if (isDebugEnabled()) {
      logger.debug(convMsg(msg, args));
    }
  }

  @Override
  public void debug(String msg, Throwable throwable) {
    logger.debug(msg, throwable);
  }

  @Override
  public void trace(Object msg) {
    logger.trace(msg.toString());
  }

  @Override
  public void trace(String msg) {
    logger.trace(msg);
  }

  @Override
  public void trace(String msg, Object... args) {
    if (isTraceEnabled()) {
      logger.trace(convMsg(msg, args));
    }
  }

  @Override
  public void trace(String msg, Throwable throwable) {
    logger.trace(msg, throwable);
  }

  private static String convMsg(String msg, Object... args) {
    return String.format(msg, args);
  }

  @Override
  public void setLevel(String level) {}

  @Override
  public String getLevel() {
    return "";
  }
}
