package com.airlock.iam.common.domain.service.state;

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.common.api.application.configuration.state.StateRepositoryConfig;
import com.airlock.iam.common.domain.model.state.FindResult;
import com.airlock.iam.common.domain.model.state.InsertAndUnlockAdditionalKeysResult;
import com.airlock.iam.common.domain.model.state.InsertResult;
import com.airlock.iam.common.domain.model.state.LockAndFindResult;
import com.airlock.iam.common.domain.model.state.LockResult;
import com.airlock.iam.common.domain.model.state.PutResult;
import com.airlock.iam.common.domain.model.state.RemoveAndUnlockResult;
import com.airlock.iam.common.domain.model.state.RemoveResult;
import com.airlock.iam.common.domain.model.state.StateTimeout;
import com.airlock.iam.common.domain.model.state.UpdateAndUnlockResult;
import java.time.Duration;
import java.util.List;
import java.util.Optional;

@LogicForConfig(StateRepositoryConfig.class)
public interface StateRepository {
   Duration MAX_LOCK_LIFETIME = Duration.ofMinutes(5L);

   InsertResult insert(StateRepositoryKey var1, String var2, StateTimeout var3, StateRepositoryKey... var4);

   PutResult put(StateRepositoryKey var1, String var2, StateTimeout var3);

   FindResult find(StateRepositoryKey var1);

   Optional<String> findReadOnly(StateRepositoryKey var1);

   RemoveResult remove(StateRepositoryKey var1);

   LockAndFindResult lockAndFind(StateRepositoryKey var1);

   UpdateAndUnlockResult updateAndUnlock(StateRepositoryKey var1, String var2, StateTimeout var3, StateRepositoryKey... var4);

   InsertAndUnlockAdditionalKeysResult insertAndUnlockAdditionalKeys(StateRepositoryKey var1, String var2, StateTimeout var3, StateRepositoryKey... var4);

   RemoveAndUnlockResult removeAndUnlock(StateRepositoryKey var1);

   void removeAndForceUnlock(StateRepositoryKey var1);

   LockResult lock(StateRepositoryKey var1);

   boolean unlock(StateRepositoryKey var1);

   void clear();

   List<StateRepositoryLockKey> retrieveAllLockKeys();
}
