package com.airlock.iam.authentication.domain.model.migration.condition;

import com.airlock.iam.authentication.application.configuration.migration.condition.NeverMigrateConditionConfig;
import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.common.api.domain.model.user.PersistentUser;
import com.airlock.iam.common.domain.model.principal.UserPrincipal;
import com.airlock.iam.flow.api.domain.model.step.FlowCondition;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.time.Duration;
import java.time.Instant;
import java.util.Date;
import java.util.Optional;

@LogicForConfig(NeverMigrateConditionConfig.class)
public class NeverMigrateCondition implements FlowCondition {
   private final NeverMigrateConditionConfig config;
   private final Provider<UserPrincipal> principal;

   @Inject
   public NeverMigrateCondition(NeverMigrateConditionConfig config, Provider<UserPrincipal> principal) {
      this.config = config;
      this.principal = principal;
   }

   @Override
   public boolean isFulfilled() {
      PersistentUser user = ((UserPrincipal)this.principal.get()).user();
      Date migrationDate = user.getAuthMigrationDate();
      return migrationDate == null ? true : this.config.isNeverMigratePossibleWithToDate() && this.isWithinOrAfterNeverMigratePeriod(migrationDate);
   }

   private boolean isWithinOrAfterNeverMigratePeriod(Date migrationDate) {
      Optional<Duration> duration = this.config.getNeverMigratePeriodDuration();
      if (duration.isEmpty()) {
         return true;
      }

      Instant neverMigratePeriodStart = migrationDate.toInstant().minus(duration.get());
      return Instant.now().isAfter(neverMigratePeriodStart);
   }

   @Override
   public String displayName() {
      return "Never Migrate Possible";
   }
}
