package com.airlock.iam.admin.application.service.user.rememberme;

import com.airlock.iam.admin.api.domain.model.administrator.CurrentAdministrator;
import com.airlock.iam.base.api.domain.model.user.UserId;
import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.log.api.helpdesk.HelpdeskLogger;
import com.airlock.iam.log.api.signing.SigningLogger;
import jakarta.inject.Inject;
import lombok.NonNull;

public final class RememberMeAdminLoggerImpl implements RememberMeAdminLogger {
   private final SigningLogger signingLogger;
   private final HelpdeskLogger helpdeskLogger;
   private final CurrentAdministrator administrator;

   @Inject
   RememberMeAdminLoggerImpl(@NonNull SigningLogger signingLogger, @NonNull HelpdeskLogger helpdeskLogger, @NonNull CurrentAdministrator administrator) {
      if (signingLogger == null) {
         throw new NullPointerException("signingLogger is marked non-null but is null");
      }

      if (helpdeskLogger == null) {
         throw new NullPointerException("helpdeskLogger is marked non-null but is null");
      }

      if (administrator == null) {
         throw new NullPointerException("administrator is marked non-null but is null");
      }

      this.signingLogger = signingLogger;
      this.helpdeskLogger = helpdeskLogger;
      this.administrator = administrator;
   }

   @Override
   public void logRememberMeTokensDeleted(UserId iamUserId) {
      this.log(
         String.format(
            "Administrator %s deleted all Remember-Me tokens from user %s", LogUtil.logSafeQuote(this.administrator.getName()), LogUtil.logSafeQuote(iamUserId)
         ),
         iamUserId
      );
   }

   private void log(String message, UserId affectedUserId) {
      this.signingLogger.log(message);
      this.helpdeskLogger.log(affectedUserId, message);
   }
}
