package org.eclipse.scout.sdk.util.log;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.scout.commons.StringUtility;
import org.osgi.framework.BundleContext;

public class SdkLogManager {

  private static final String LOG_LEVEL_SUFFIX = ".loglevel";

  private int m_loglevel;
  private final Plugin m_plugin;

  public SdkLogManager(Plugin p) {
    this(p, getLogLevelProperty(p));
  }

  public SdkLogManager(Plugin p, String logLevel) {
    this(p, parseLogLevel(logLevel));
  }

  public SdkLogManager(Plugin p, int logLevel) {
    m_plugin = p;
    m_loglevel = logLevel;
  }

  private LogStatus createLogStatus(int severity, String message, Throwable t) {
    return new LogStatus(m_plugin.getClass(), severity, m_plugin.getBundle().getSymbolicName(), message, t);
  }

  private LogStatus createLogStatus(IStatus log) {
    if (log instanceof LogStatus) {
      return (LogStatus) log;
    }
    else {
      return new LogStatus(m_plugin.getClass(), log.getSeverity(), log.getPlugin(), log.getMessage(), log.getException());
    }
  }

  private void logImpl(LogStatus log) {
    if ((log.getSeverity() & m_loglevel) != 0) {
      m_plugin.getLog().log(log);
    }
  }

  public void log(IStatus log) {
    logImpl(createLogStatus(log));
  }

  public void logInfo(Throwable t) {
    logInfo(null, t);
  }

  public void logInfo(String message) {
    logInfo(message, null);
  }

  public void logInfo(String message, Throwable t) {
    if (message == null) {
      message = "";
    }
    logImpl(createLogStatus(IStatus.INFO, message, t));
  }

  public void logWarning(String message) {
    logWarning(message, null);
  }

  public void logWarning(Throwable t) {
    logWarning(null, t);
  }

  public void logWarning(String message, Throwable t) {
    if (message == null) {
      message = "";
    }
    logImpl(createLogStatus(IStatus.WARNING, message, t));
  }

  public void logError(Throwable t) {
    logError("", t);
  }

  public void logError(String message) {
    logError(message, null);
  }

  public void logError(String message, Throwable t) {
    if (message == null) {
      message = "";
    }
    logImpl(createLogStatus(IStatus.ERROR, message, t));
  }

  /**
   * @see SdkLogManager#log(int, String, Throwable)
   */
  public void log(int logLevel, Throwable t) {
    log(logLevel, "", t);
  }

  /**
   * @see SdkLogManager#log(int, String, Throwable)
   */
  public void log(int logLevel, String message) {
    log(logLevel, message, null);
  }

  /**
   * @param logLevel
   *          one of {@link IStatus#INFO}, {@link IStatus#WARNING} or {@link IStatus#ERROR}
   * @param message
   * @param t
   */
  public void log(int logLevel, String message, Throwable t) {
    if (message == null) {
      message = "";
    }
    logImpl(createLogStatus(logLevel, message, t));
  }

  private static String getLogLevelProperty(Plugin p) {
    if (p != null && p.getBundle() != null) {
      return getLogLevelProperty(p.getBundle().getBundleContext());
    }
    else {
      return null;
    }
  }

  private static String getLogLevelProperty(BundleContext context) {
    if (context == null) return null;
    else return context.getProperty(context.getBundle().getSymbolicName() + LOG_LEVEL_SUFFIX);
  }

  private static int parseLogLevel(String loglevel) {
    int level = IStatus.INFO | IStatus.WARNING | IStatus.ERROR | IStatus.CANCEL;
    if (!StringUtility.isNullOrEmpty(loglevel)) {
      String lowerLoglevel = loglevel.toLowerCase();
      if (lowerLoglevel.equals("warning")) {
        level = IStatus.WARNING | IStatus.ERROR | IStatus.CANCEL;
      }
      else if (lowerLoglevel.equals("error")) {
        level = IStatus.ERROR | IStatus.CANCEL;
      }
      else if (lowerLoglevel.equals("cancel")) {
        level = IStatus.CANCEL;
      }
    }
    return level;
  }
}
