package com.airlock.iam.core.infrastructure;

import com.airlock.iam.log.api.signing.SigningLogger;
import com.airlock.iam.log.audit.AuditLogger;
import com.airlock.iam.log.audit.AuditLogger.CallerClass;
import com.airlock.iam.log.processor.LogMessageProcessor;
import com.airlock.iam.log.processor.NopLogMessageProcessor;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.inject.Inject;
import jakarta.inject.Provider;

public class IamSigningLogger implements SigningLogger {
   private final Provider<LogMessageProcessor> processor;

   public IamSigningLogger() {
      this(NopLogMessageProcessor::new);
   }

   @Inject
   public IamSigningLogger(Provider<LogMessageProcessor> processor) {
      this.processor = processor;
   }

   public void log(String message) {
      String source = getCallerClassName();
      this.adaptAndLogMessage(message, source);
   }

   @SuppressFBWarnings(
      value = "FORMAT_STRING_MANIPULATION",
      justification = "All callers don't allow such a string manipulation as of 2020 and spotbugs does not check the callers but only sees the variable here."
   )
   public void log(String message, Object... args) {
      String source = getCallerClassName();
      this.adaptAndLogMessage(String.format(message, args), source);
   }

   private void adaptAndLogMessage(String message, String source) {
      String adaptedMessage = ((LogMessageProcessor)this.processor.get()).adaptLogMessage(message);
      AuditLogger.log(new CallerClass(source), adaptedMessage);
   }

   private static String getCallerClassName() {
      return Thread.currentThread().getStackTrace()[3].getClassName();
   }
}
