package com.airlock.iam.saml2.infrastructure.plugin;

import com.sun.identity.shared.debug.IDebug;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.logging.Level;
import org.apache.commons.lang3.StringUtils;

public class DebugImpl implements IDebug {
   private static final Map<String, Level> LEVEL_OVERRIDE = new HashMap<>();
   private final String debugInstanceName;

   public DebugImpl(String strDebugName) {
      this.debugInstanceName = strDebugName;
   }

   @Override
   public String getName() {
      return this.debugInstanceName;
   }

   @Override
   public int getState() {
      return 4;
   }

   @Override
   public void setDebug(int level) {
   }

   @Override
   public void setDebug(String strDebugLevel) {
   }

   @Override
   public boolean messageEnabled() {
      return LoggerImpl.isDebugEnabled();
   }

   @Override
   public boolean warningEnabled() {
      return true;
   }

   @Override
   public boolean errorEnabled() {
      return true;
   }

   @Override
   public void message(String message, Throwable th) {
      this.logMessage(Level.FINE, message, th);
   }

   @Override
   public void warning(String message, Throwable th) {
      this.logMessage(Level.WARNING, message, th);
   }

   @Override
   public void error(String message, Throwable th) {
      Level level = this.getLevelForMessage(Level.WARNING, message);
      this.logMessage(level, message, th);
   }

   @Override
   public void resetDebug(String mf) {
   }

   private void logMessage(Level level, String message, Throwable th) {
      if (StringUtils.isNotBlank(message)) {
         LoggerImpl.log(level, message, th);
      }
   }

   private Level getLevelForMessage(Level proposedLevel, String message) {
      if (StringUtils.isEmpty(message)) {
         return proposedLevel;
      }

      Level level = LEVEL_OVERRIDE.get(message);
      if (level != null) {
         return level;
      }

      for (Entry<String, Level> entry : LEVEL_OVERRIDE.entrySet()) {
         if (message.startsWith(entry.getKey())) {
            return entry.getValue();
         }
      }

      return proposedLevel;
   }

   static {
      LEVEL_OVERRIDE.put("processLogoutRequest : invalid Name ID received", Level.INFO);
      LEVEL_OVERRIDE.put("processLogoutRequest : Could not create session from token ID", Level.INFO);
   }
}
