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

import com.airlock.iam.base.api.domain.model.exception.FailureException;
import com.airlock.iam.base.api.domain.model.user.UserId;
import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.common.api.domain.model.persistency.exception.PersisterException;
import com.airlock.iam.core.misc.impl.persistency.CredentialBeanImpl;
import com.airlock.iam.core.misc.persistency.CredentialBean;
import com.airlock.iam.core.misc.persistency.CredentialPersister;
import com.airlock.iam.core.misc.persistency.CredentialBean.CredentialDataEncoding;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.elog.api.LogTypes;
import org.apache.commons.lang3.StringUtils;

public final class RememberMeJspPersisterServiceImpl implements RememberMeJspPersisterService {
   private static final ELogger LOG = ELoggerFactory.getLogger(RememberMeJspPersisterServiceImpl.class);
   private final CredentialPersister credentialPersister;

   public RememberMeJspPersisterServiceImpl(CredentialPersister credentialPersister) {
      this.credentialPersister = credentialPersister;
   }

   @Override
   public void clearSecretForUser(UserId userId) {
      try {
         CredentialBeanImpl emptyCredential = new CredentialBeanImpl(CredentialDataEncoding.STRING);
         this.credentialPersister.makeCredentialPersistent(userId.getValue(), emptyCredential);
      } catch (PersisterException e) {
         throw new FailureException("Error clearing remember-me user secret: " + e.getMessage(), e);
      }
   }

   @Override
   public boolean hasRememberMeCookies(UserId userId) {
      try {
         CredentialBean credential = this.credentialPersister.getPersistentCredentialByUsername(userId.getValue());
         return !credential.isReallyActive() ? false : credential.getCurrent() != null && !StringUtils.isBlank(credential.getCurrent().getStringData());
      } catch (PersisterException e) {
         LOG.warn(LogTypes.CONFIGURATION_ERROR, String.format("Error loading credential for user %s: %s", LogUtil.quote(userId), e.getMessage()));
         return false;
      }
   }
}
