/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 org.apache.logging.log4j.core.config;

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.util.Supplier;

/**
 * Interface for objects that know how to ensure delivery of log events to the appropriate appenders, even during and
 * after the configuration has been modified while the system is actively used.
 */
public interface ReliabilityStrategy {

    /**
     * Logs an event.
     *
     * @param reconfigured supplies the next LoggerConfig if the strategy's LoggerConfig is no longer active
     * @param loggerName The name of the Logger.
     * @param fqcn The fully qualified class name of the caller.
     * @param marker A Marker or null if none is present.
     * @param level The event Level.
     * @param data The Message.
     * @param t A Throwable or null.
     */
    void log(Supplier<LoggerConfig> reconfigured, String loggerName, String fqcn, Marker marker, Level level,
            Message data, Throwable t);
    /**
     * Logs an event.
     *
     * @param reconfigured supplies the next LoggerConfig if the strategy's LoggerConfig is no longer active
     * @param loggerName The name of the Logger.
     * @param fqcn The fully qualified class name of the caller.
     * @param location The location of the caller or null.
     * @param marker A Marker or null if none is present.
     * @param level The event Level.
     * @param data The Message.
     * @param t A Throwable or null.
     * @since 3.0
     */
    default void log(Supplier<LoggerConfig> reconfigured, String loggerName, String fqcn, StackTraceElement location,
            Marker marker, Level level, Message data, Throwable t) {
    }

    /**
     * Logs an event.
     *
     * @param reconfigured supplies the next LoggerConfig if the strategy's LoggerConfig is no longer active
     * @param event The log event.
     */
    void log(Supplier<LoggerConfig> reconfigured, LogEvent event);

    /**
     * For internal use by the ReliabilityStrategy; returns the LoggerConfig to use.
     * 
     * @param next supplies the next LoggerConfig if the strategy's LoggerConfig is no longer active
     * @return the currently active LoggerConfig
     */
    LoggerConfig getActiveLoggerConfig(Supplier<LoggerConfig> next);

    /**
     * Called after a log event was logged.
     */
    void afterLogEvent();

    /**
     * Called before all appenders are stopped.
     */
    void beforeStopAppenders();

    /**
     * Called before the configuration is stopped.
     * 
     * @param configuration the configuration that will be stopped
     */
    void beforeStopConfiguration(Configuration configuration);

}
