/**
 * This file is part of the Meeds project (https://meeds.io/).
 *
 * Copyright (C) 2020 - 2025 Meeds Association contact@meeds.io
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or (at your option) any later version.
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */
package org.exoplatform.services.log;

/**
 * Created by The eXo Platform SAS
 * 
 */
public interface Log
{

   /**
    * <p>
    * Is debug logging currently enabled?
    * </p>
    * <p>
    * Call this method to prevent having to perform expensive operations (for
    * example, <code>String</code> concatenation) when the log level is more than
    * debug.
    * </p>
    * 
    * @return true if debug is enabled in the underlying logger.
    */
   boolean isDebugEnabled();

   /**
    * <p>
    * Is error logging currently enabled?
    * </p>
    * <p>
    * Call this method to prevent having to perform expensive operations (for
    * example, <code>String</code> concatenation) when the log level is more than
    * error.
    * </p>
    * 
    * @return true if error is enabled in the underlying logger.
    */
   boolean isErrorEnabled();

   /**
    * <p>
    * Is fatal logging currently enabled?
    * </p>
    * <p>
    * Call this method to prevent having to perform expensive operations (for
    * example, <code>String</code> concatenation) when the log level is more than
    * fatal.
    * </p>
    * 
    * @return true if fatal is enabled in the underlying logger.
    */
   boolean isFatalEnabled();

   /**
    * <p>
    * Is info logging currently enabled?
    * </p>
    * <p>
    * Call this method to prevent having to perform expensive operations (for
    * example, <code>String</code> concatenation) when the log level is more than
    * info.
    * </p>
    * 
    * @return true if info is enabled in the underlying logger.
    */
   boolean isInfoEnabled();

   /**
    * <p>
    * Is trace logging currently enabled?
    * </p>
    * <p>
    * Call this method to prevent having to perform expensive operations (for
    * example, <code>String</code> concatenation) when the log level is more than
    * trace.
    * </p>
    * 
    * @return true if trace is enabled in the underlying logger.
    */
   boolean isTraceEnabled();

   /**
    * <p>
    * Is warn logging currently enabled?
    * </p>
    * <p>
    * Call this method to prevent having to perform expensive operations (for
    * example, <code>String</code> concatenation) when the log level is more than
    * warn.
    * </p>
    * 
    * @return true if warn is enabled in the underlying logger.
    */
   boolean isWarnEnabled();

   // -------------------------------------------------------- Logging Methods

   /**
    * <p>
    * Log a message with trace log level.
    * </p>
    * 
    * @param message log this message
    */
   void trace(Object message);

   /**
    * <p>
    * Log an error with trace log level.
    * </p>
    * 
    * @param message log this message
    * @param t log this cause
    */
   void trace(Object message, Throwable t);

   /**
    * <p>
    * Log a message with debug log level.
    * </p>
    * 
    * @param message log this message
    */
   void debug(Object message);

   /**
    * <p>
    * Log an error with debug log level.
    * </p>
    * 
    * @param message log this message
    * @param t log this cause
    */
   void debug(Object message, Throwable t);

   /**
    * <p>
    * Log a message with info log level.
    * </p>
    * 
    * @param message log this message
    */
   void info(Object message);

   /**
    * <p>
    * Log an error with info log level.
    * </p>
    * 
    * @param message log this message
    * @param t log this cause
    */
   void info(Object message, Throwable t);

   /**
    * <p>
    * Log a message with warn log level.
    * </p>
    * 
    * @param message log this message
    */
   void warn(Object message);

   /**
    * <p>
    * Log an error with warn log level.
    * </p>
    * 
    * @param message log this message
    * @param t log this cause
    */
   void warn(Object message, Throwable t);

   /**
    * <p>
    * Log a message with error log level.
    * </p>
    * 
    * @param message log this message
    */
   void error(Object message);

   /**
    * <p>
    * Log an error with error log level.
    * </p>
    * 
    * @param message log this message
    * @param t log this cause
    */
   void error(Object message, Throwable t);

   /**
    * <p>
    * Log a message with fatal log level.
    * </p>
    * 
    * @param message log this message
    */
   void fatal(Object message);

   /**
    * <p>
    * Log an error with fatal log level.
    * </p>
    * 
    * @param message log this message
    * @param t log this cause
    */
   void fatal(Object message, Throwable t);

   /**
    * <p>
    * Log an error with <i>trace</i> log level.
    * </p>
    * 
    * @param format <br> {@link String} format to represent log message.
    * Sequence of '{}' is used to represent an anchor which will be replaced by
    * string representation of objects in argArray
    * @param argArray <br> array of arguments to add to log message
    * including {@link Throwable}, {@link String} 
    * or any other {@link Object} for which string representation will be used
    */
   void trace(String format, Object... argArray);

   /**
    * <p>
    * Log an error with <i>debug</i> log level.
    * </p>
    * 
    * @param format <br> {@link String} format to represent log message.
    * Sequence of '{}' is used to represent an anchor which will be replaced by
    * string representation of objects in argArray
    * @param argArray <br> array of arguments to add to log message
    * including {@link Throwable}, {@link String} 
    * or any other {@link Object} for which string representation will be used
    */
   void debug(String format, Object... argArray);

   /**
    * <p>
    * Log an error with <i>info</i> log level.
    * </p>
    * 
    * @param format <br> {@link String} format to represent log message.
    * Sequence of '{}' is used to represent an anchor which will be replaced by
    * string representation of objects in argArray
    * @param argArray <br> array of arguments to add to log message
    * including {@link Throwable}, {@link String} 
    * or any other {@link Object} for which string representation will be used
    */
   void info(String format, Object... argArray);

   /**
    * <p>
    * Log a message with <i>warn</i> log level.
    * </p>
    * 
    * @param format <br> {@link String} format to represent log message.
    * Sequence of '{}' is used to represent an anchor which will be replaced by
    * string representation of objects in argArray
    * @param argArray <br> array of arguments to add to log message
    * including {@link Throwable}, {@link String} 
    * or any other {@link Object} for which string representation will be used
    */
   void warn(String format, Object... argArray);

   /**
    * <p>
    * Log a message with <i>error</i> log level.
    * </p>
    * 
    * @param format <br> {@link String} format to represent log message.
    * Sequence of '{}' is used to represent an anchor which will be replaced by
    * string representation of objects in argArray
    * @param argArray <br> array of arguments to add to log message
    * including {@link Throwable}, {@link String} 
    * or any other {@link Object} for which string representation will be used
    */
   void error(String format, Object... argArray);

   /**
    * <p>
    * Log a message with <i>fatal</i> log level.
    * </p>
    * 
    * @param format <br> {@link String} format to represent log message.
    * Sequence of '{}' is used to represent an anchor which will be replaced by
    * string representation of objects in argArray
    * @param argArray <br> array of arguments to add to log message
    * including {@link Throwable}, {@link String} 
    * or any other {@link Object} for which string representation will be used
    */
   void fatal(String format, Object... argArray);

}
