package com.airlock.iam.flow.shared.domain.model.airlock2fa;

import com.airlock.iam.airlock2fa.api.domain.model.Airlock2FADeviceId;
import com.airlock.iam.base.api.domain.model.mapification.MapifiedValues;
import com.airlock.iam.base.domain.model.mapification.MapificationUtils;
import com.airlock.iam.base.domain.model.mapification.MapifiedValuesBuilder;
import com.airlock.iam.factor.domain.service.airlock2fa.Airlock2FACooldownInformationServiceImpl;
import com.airlock.iam.flow.shared.api.domain.model.session.UserSessionScopedFlowAttribute;
import java.time.Instant;
import java.util.Optional;

public record Airlock2FAAuthDeviceAttribute(
   Airlock2FADeviceId deviceId, Airlock2FACooldownInformationServiceImpl.Airlock2FAAuthDeviceCooldownStatus cooldownStatus, Optional<Instant> cooldownEnds
) implements UserSessionScopedFlowAttribute<Airlock2FAAuthDeviceAttribute> {
   private static final String DEVICE_ID_KEY = "deviceId";
   private static final String COOLDOWN_STATUS_KEY = "authDeviceCooldownStatus";
   private static final String COOLDOWN_ENDS_KEY = "authDeviceCooldownEnds";

   public Airlock2FAAuthDeviceAttribute mergeWith(Airlock2FAAuthDeviceAttribute newAttribute) {
      return newAttribute;
   }

   @Override
   public MapifiedValues mapify() {
      return MapifiedValuesBuilder.mapifiedValues()
         .put("deviceId", this.deviceId.id())
         .put("authDeviceCooldownStatus", this.cooldownStatus.name())
         .putIfPresent("authDeviceCooldownEnds", this.cooldownEnds.map(MapificationUtils::mapifyInstant))
         .build();
   }

   public static Airlock2FAAuthDeviceAttribute demapify(MapifiedValues values) {
      return new Airlock2FAAuthDeviceAttribute(
         Airlock2FADeviceId.airlock2FADeviceId(values.get("deviceId")),
         Airlock2FACooldownInformationServiceImpl.Airlock2FAAuthDeviceCooldownStatus.valueOf(values.get("authDeviceCooldownStatus")),
         values.demapifyOptional("authDeviceCooldownEnds", MapificationUtils::demapifyInstant)
      );
   }

   public Airlock2FAAuthDeviceAttribute copyAttribute() {
      return new Airlock2FAAuthDeviceAttribute(this.deviceId, this.cooldownStatus, this.cooldownEnds);
   }
}
