package com.airlock.iam.admin.domain.model.user;

import com.airlock.iam.base.misc.adapt.AdaptFrom;
import com.airlock.iam.base.misc.adapt.AdaptTo;
import com.airlock.iam.common.api.domain.model.locking.LockReason;
import com.airlock.iam.common.api.domain.model.user.PersistentUser;
import com.airlock.iam.common.domain.model.user.Lockable;
import com.airlock.iam.common.domain.model.user.LockableImpl;
import com.airlock.iam.common.domain.model.user.UserLockState;
import com.google.common.annotations.VisibleForTesting;

public class AdminLockable implements Lockable {
   private final PersistentUser user;
   private final Lockable commonLockable;

   private AdminLockable(PersistentUser user) {
      this(user, new LockableImpl(user));
   }

   @AdaptFrom
   public static AdminLockable fromUser(PersistentUser user) {
      return new AdminLockable(user);
   }

   @VisibleForTesting
   AdminLockable(PersistentUser user, Lockable commonLockable) {
      this.user = user;
      this.commonLockable = commonLockable;
   }

   @AdaptTo
   public PersistentUser toUser() {
      return this.getUser();
   }

   public String id() {
      return this.user.getName();
   }

   public void unlock() {
      this.commonLockable.unlock();
      this.getUser().resetUnlockAttempts();
   }

   @VisibleForTesting
   PersistentUser getUser() {
      return this.user;
   }

   public void lock(LockReason reason) {
      this.commonLockable.lock(reason);
   }

   public void lock(String reason) {
      this.commonLockable.lock(reason);
   }

   public UserLockState lockState() {
      return this.commonLockable.lockState();
   }
}
