/*
 * Copyright 2012-2019 the original author or authors.
 *
 * 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
 *
 *      https://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.springframework.boot.liquibase;

import liquibase.logging.LogLevel;
import liquibase.logging.Logger;
import liquibase.logging.core.AbstractLogger;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * Liquibase {@link Logger} that delegates to an Apache Commons {@link Log}.
 *
 * @author Michael Cramer
 * @author Phillip Webb
 * @author Andy Wilkinson
 * @since 1.2.0
 */
public class CommonsLoggingLiquibaseLogger extends AbstractLogger {

	/**
	 * The priority for the {@link CommonsLoggingLiquibaseLogger}.
	 */
	public static final int PRIORITY = 10;

	private Log logger;

	@Override
	public void setName(String name) {
		this.logger = createLogger(name);
	}

	/**
	 * Factory method used to create the logger.
	 * @param name the name of the logger
	 * @return a {@link Log} instance
	 */
	protected Log createLogger(String name) {
		return LogFactory.getLog(name);
	}

	@Override
	public void setLogLevel(String logLevel, String logFile) {
		super.setLogLevel(logLevel);
	}

	@Override
	public void severe(String message) {
		if (isEnabled(LogLevel.SEVERE)) {
			this.logger.error(buildMessage(message));
		}
	}

	@Override
	public void severe(String message, Throwable e) {
		if (isEnabled(LogLevel.SEVERE)) {
			this.logger.error(buildMessage(message), e);
		}
	}

	@Override
	public void warning(String message) {
		if (isEnabled(LogLevel.WARNING)) {
			this.logger.warn(buildMessage(message));
		}
	}

	@Override
	public void warning(String message, Throwable e) {
		if (isEnabled(LogLevel.WARNING)) {
			this.logger.warn(buildMessage(message), e);
		}
	}

	@Override
	public void info(String message) {
		if (isEnabled(LogLevel.INFO)) {
			this.logger.info(buildMessage(message));
		}
	}

	@Override
	public void info(String message, Throwable e) {
		if (isEnabled(LogLevel.INFO)) {
			this.logger.info(buildMessage(message), e);
		}
	}

	@Override
	public void debug(String message) {
		if (isEnabled(LogLevel.DEBUG)) {
			this.logger.debug(buildMessage(message));
		}
	}

	@Override
	public void debug(String message, Throwable e) {
		if (isEnabled(LogLevel.DEBUG)) {
			this.logger.debug(buildMessage(message), e);
		}
	}

	@Override
	public int getPriority() {
		return PRIORITY;
	}

	private boolean isEnabled(LogLevel level) {
		if (this.logger != null) {
			switch (level) {
			case DEBUG:
				return this.logger.isDebugEnabled();
			case INFO:
				return this.logger.isInfoEnabled();
			case WARNING:
				return this.logger.isWarnEnabled();
			case SEVERE:
				return this.logger.isErrorEnabled();
			}
		}
		return false;
	}

}
