// ***************************************************************************************************************************
// * 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.juneau.microservice;

import java.util.*;
import java.util.logging.*;
import java.util.logging.Formatter;

import org.apache.juneau.microservice.resources.*;

/**
 * Can be used for configuration of simple logging in the microservice.
 *
 * <p>
 * Instances of this class can be created using {@link #create()} and passing the result to
 * {@link MicroserviceBuilder#logConfig(LogConfig)}.
 *
 * <p>
 * These values override values specified in the <js>"Logging"</js> configuration section.
 */
public class LogConfig {

	String logFile, logDir;
	Boolean append;
	Integer limit, count;
	Level fileLevel, consoleLevel;
	Map<String,Level> levels = new LinkedHashMap<>();
	Formatter formatter;

	LogConfig() {}

	/**
	 * Copy constructor.
	 *
	 * @param copyFrom The log config to copy from.
	 */
	protected LogConfig(LogConfig copyFrom) {
		this.logFile = copyFrom.logFile;
		this.logDir = copyFrom.logDir;
		this.append = copyFrom.append;
		this.limit = copyFrom.limit;
		this.count = copyFrom.count;
		this.fileLevel = copyFrom.fileLevel;
		this.consoleLevel = copyFrom.consoleLevel;
		this.levels = new LinkedHashMap<>(copyFrom.levels);
		this.formatter = copyFrom.formatter;
	}

	/**
	 * Creates a copy of this log configuration.
	 *
	 * @return A new copy of this log configuration.
	 */
	public LogConfig copy() {
		return new LogConfig(this);
	}

	/**
	 * Creates a new instance of this config.
	 *
	 * @return A new instance of this config.
	 */
	public static LogConfig create() {
		return new LogConfig();
	}

	/**
	 * Returns the name of the log file on the file system to store the log file for this microservice.
	 *
	 * <p>
	 * This overrides the configuration value <js>"Logging/logFile"</js>.
	 * If not specified, no file system logging will be used.
	 *
	 * @param logFile The log file.
	 * @return This object (for method chaining).
	 */
	public LogConfig logFile(String logFile) {
		this.logFile = logFile;
		return this;
	}

	/**
	 * The location of the log directory to create the log file.
	 *
	 * <p>
	 * This overrides the configuration value <js>"Logging/logDir"</js>.
	 * If not specified, uses the JVM working directory.
	 *
	 * @param logDir The log directory location as a path relative to the working directory.
	 * @return This object (for method chaining).
	 */
	public LogConfig logDir(String logDir) {
		this.logDir = logDir;
		return this;
	}

	/**
	 * The log entry formatter.
	 *
	 * <p>
	 * If not specified, uses the following values pulled from the configuration to construct a {@link LogEntryFormatter}:
	 * <ul>
	 * 	<li><js><js>"Logging/format"</js> (default is <js>"[{date} {level}] {msg}%n"</js>)
	 * 	<li><js><js>"Logging/dateFormat"</js> (default is <js>"yyyy.MM.dd hh:mm:ss"</js>)
	 * 	<li><js><js>"Logging/useStackTraceHashes"</js> (default is <jk>false</jk>)
	 * </ul>
	 *
	 *
	 * @param formatter The log entry formatter.
	 * @return This object (for method chaining).
	 * @see LogEntryFormatter
	 */
	public LogConfig formatter(Formatter formatter) {
		this.formatter = formatter;
		return this;
	}

	/**
	 * Specified append mode for the log file.
	 *
	 * @return This object (for method chaining).
	 */
	public LogConfig append() {
		this.append = true;
		return this;
	}

	/**
	 * The maximum number of bytes to write to any one log file.
	 *
	 * @param limit The number of bytes.
	 * @return This object (for method chaining).
	 */
	public LogConfig limit(int limit) {
		this.limit = limit;
		return this;
	}

	/**
	 * The number of log files to use.
	 *
	 * @param count The number of log files.
	 * @return This object (for method chaining).
	 */
	public LogConfig count(int count) {
		this.count = count;
		return this;
	}

	/**
	 * The default logging level for the log file.
	 *
	 * @param fileLevel The logging level.
	 * @return This object (for method chaining).
	 */
	public LogConfig fileLevel(Level fileLevel) {
		this.fileLevel = fileLevel;
		return this;
	}

	/**
	 * The default logging level for the console.
	 *
	 * @param consoleLevel The logging level.
	 * @return This object (for method chaining).
	 */
	public LogConfig consoleLevel(Level consoleLevel) {
		this.consoleLevel = consoleLevel;
		return this;
	}

	/**
	 * Default logging levels for loggers.
	 *
	 * @param levels A map of logger names to logger levels.
	 * @return This object (for method chaining).
	 */
	public LogConfig levels(Map<String,Level> levels) {
		this.levels.putAll(levels);
		return this;
	}

	/**
	 * Default logging level for logger.
	 *
	 * @param logger Logger name.
	 * @param level Logger level.
	 * @return This object (for method chaining).
	 */
	public LogConfig level(String logger, Level level) {
		this.levels.put(logger, level);
		return this;
	}
}
