package com.airlock.iam.flow.shared.domain.service.continuation;

import com.airlock.iam.base.api.domain.model.user.UserId;
import com.airlock.iam.flow.api.domain.model.flow.FlowId;
import com.airlock.iam.flow.shared.domain.model.continuation.FlowContinuationInformation;
import com.airlock.iam.flow.shared.domain.model.continuation.FlowContinuationToken;
import com.airlock.iam.flow.shared.domain.model.continuation.FlowContinuationTokenHash;
import com.airlock.iam.plugin.api.config.ConfigurationContext;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.time.Duration;
import java.time.Instant;
import java.util.Optional;

public final class FlowContinuationTokenServiceImpl implements FlowContinuationTokenService {
   private final Provider<FlowContinuationTokenRepository> repository;
   private final Provider<ConfigurationContext> context;

   @Inject
   public FlowContinuationTokenServiceImpl(Provider<FlowContinuationTokenRepository> repository, Provider<ConfigurationContext> context) {
      this.repository = repository;
      this.context = context;
   }

   @Override
   public FlowContinuationToken createContinuationToken(UserId userId, FlowId targetFlowId, Duration validity) {
      FlowContinuationToken token = FlowContinuationToken.createRandomFlowContinuationToken();
      FlowContinuationInformation information = new FlowContinuationInformation(
         token.hash(), userId, targetFlowId, Instant.now(), Instant.now().plus(validity), (ConfigurationContext)this.context.get()
      );
      ((FlowContinuationTokenRepository)this.repository.get()).insert(information);
      return token;
   }

   @Override
   public Optional<FlowContinuationInformation> resolveContinuationToken(FlowContinuationToken token) {
      return ((FlowContinuationTokenRepository)this.repository.get()).findByTokenHash(token.hash());
   }

   @Override
   public void deleteContinuationToken(FlowContinuationTokenHash tokenHash) {
      ((FlowContinuationTokenRepository)this.repository.get()).delete(tokenHash);
   }
}
