package com.airlock.iam.factor.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 java.util.Set;
import java.util.stream.Collectors;

public class Airlock2FAAuthDeviceMapifier {
   private static final String DEVICE_TYPE_KEY = "deviceType";
   private static final String DISPLAY_NAME_KEY = "displayName";
   private static final String DEVICE_ID_KEY = "deviceId";
   private static final String CAPABILITIES_KEY = "capabilities";
   private static final String ENROLLED_AT_KEY = "enrolledAt";
   private static final String MIGRATED_FROM_KEY = "migratedFrom";

   public static MapifiedValues mapifyAirlock2FAAuthDevice(Airlock2FAAuthDevice device) {
      return MapifiedValuesBuilder.mapifiedValues()
         .put("deviceType", device.getDeviceType().name())
         .put("displayName", device.getDisplayName().getValue())
         .put("deviceId", device.getId().id())
         .putIfNotEmpty("capabilities", device.getCapabilities().stream().map(Enum::name).toList())
         .put("enrolledAt", MapificationUtils.mapifyUnixTimestamp(device.getEnrolledAt()))
         .putIfPresent("migratedFrom", device.getMigratedFrom().map(Airlock2FADeviceId::id))
         .build();
   }

   public static Airlock2FAAuthDevice demapifyAirlock2FAAuthDevice(MapifiedValues values) {
      return new Airlock2FAAuthDevice(
         Airlock2FADeviceId.airlock2FADeviceId(values.get("deviceId")),
         MapificationUtils.demapifyEnumOfClass(values.get("deviceType"), Airlock2FADeviceType.class),
         Airlock2FADeviceDisplayName.airlock2FADeviceDisplayName(values.get("displayName")),
         demapifyCapabilities(values),
         values.demapifyValue("enrolledAt", MapificationUtils::demapifyUnixTimestamp),
         values.transformOptional("migratedFrom", Airlock2FADeviceId::airlock2FADeviceId)
      );
   }

   private static Set<Airlock2FADeviceCapability> demapifyCapabilities(MapifiedValues values) {
      return values.<String>getList("capabilities")
         .stream()
         .map(v -> MapificationUtils.demapifyEnumOfClass(v, Airlock2FADeviceCapability.class))
         .collect(Collectors.toSet());
   }
}
