/*
 * Copyright (c) 1990-2012 kopiLeft Development SARL, Bizerte, Tunisia
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License version 2.1 as published by the Free Software Foundation.
 *
 * This library 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 library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 *
 * $Id$
 */

package org.kopi.ebics.session;

import java.io.File;

import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.RollingFileAppender;
import org.kopi.ebics.exception.ReturnCode;
import org.kopi.ebics.interfaces.EbicsLogger;


/**
 * A simple EBICS transfers logger base on log4j framework.
 *
 * @author hacheni
 *
 */
public class DefaultEbicsLogger implements EbicsLogger {

  /**
   * Constructs a new ebics logger
   */
  public DefaultEbicsLogger() {
    this(null);
  }

  /**
   * Constructs a new ebics logger with a given file
   * @param logFile the log file
   */
  public DefaultEbicsLogger(File logFile) {
    this.logFile = logFile;
    logger = Logger.getLogger(DefaultEbicsLogger.class);
    consoleAppender = new ConsoleAppender();
    fileAppender = new RollingFileAppender();
  }

  /**
   * Enables or disable the console log
   * @param enabled the console log state
   */
  public void setConsoleLoggingEnabled(boolean enabled) {
    if (enabled) {
      if (!logger.isAttached(consoleAppender)) {
	addConsoleAppender();
      }
    } else {
      removeConsoleAppender();
    }
  }

  /**
   * Enables or disable the file logging
   * @param enabled the file log state
   */
  public void setFileLoggingEnabled(boolean enabled) {
    if (enabled) {
      if (!logger.isAttached(fileAppender)) {
	if (logFile != null) {
	  addFileAppender();
	}
      }
    } else {
      removeFileAppender();
    }
  }

  /**
   * Adds the console appender to the current logger.
   */
  private void addConsoleAppender() {
    PatternLayout		layout;

    layout = new PatternLayout();
    layout.setConversionPattern("%d %5p - %m%n");
    consoleAppender.setLayout(layout);
    consoleAppender.setTarget("System.out");
    consoleAppender.activateOptions();
    logger.addAppender(consoleAppender);
  }

  /**
   * Removes the console appender from the current logger.
   */
  private void removeConsoleAppender() {
    if (logger.isAttached(consoleAppender)) {
      logger.removeAppender(consoleAppender);
    }
  }

  /**
   * Adds the file appender to the current logger.
   */
  private void addFileAppender() {
    PatternLayout		layout;

    layout = new PatternLayout();
    layout.setConversionPattern("%d %5p - %m%n");
    fileAppender.setLayout(layout);
    fileAppender.setAppend(true);
    fileAppender.setFile(logFile.getAbsolutePath());
    fileAppender.setImmediateFlush(true);
    fileAppender.setMaxFileSize("5MB");
    fileAppender.setMaxBackupIndex(1);
    fileAppender.activateOptions();
    logger.addAppender(fileAppender);
  }

  /**
   * Removes the file appender from the current logger.
   */
  private void removeFileAppender() {
    if (logger.isAttached(fileAppender)) {
      logger.removeAppender(fileAppender);
    }
  }

  /**
   * Disables the log process
   */
  @Deprecated
  public void disable() {
    Logger.shutdown();
  }

  /**
   * Sets the logger level.
   * @param level the level to set
   */
  public void setLevel(int level) {
    logger.setLevel(Level.toLevel(level));
  }

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

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

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

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

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

  @Override
  public void report(ReturnCode returnCode) {
    if (returnCode.isOk()) {
      info(returnCode.getText());
    } else {
      error(returnCode.getText());
    }
  }

  @Override
  public void setLogFile(String logFile) {
    this.logFile = new File(logFile);
  }

  // --------------------------------------------------------------------
  // DATA MEMBERS
  // --------------------------------------------------------------------

  private Logger 				logger;
  private ConsoleAppender			consoleAppender;
  private RollingFileAppender			fileAppender;
  private File					logFile;

  public static final int			ALL_LEVEL = Level.ALL_INT;
  public static final int			INFO_LEVEL = Level.INFO_INT;
  public static final int			WARN_LEVEL = Level.WARN_INT;
  public static final int			ERROR_LEVEL = Level.ERROR_INT;
}