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

import com.airlock.iam.base.api.domain.model.mapification.MapifiedValues;
import com.airlock.iam.base.api.domain.model.user.UserId;
import com.airlock.iam.base.domain.model.mapification.MapifiedValuesBuilder;
import com.airlock.iam.common.domain.service.mapification.Mapifier;
import com.airlock.iam.core.misc.impl.cronto.CrontoActivationSession;
import java.util.Optional;

final class CrontoActivationSessionMapificationUtils {
   private static final String USER_ID_KEY = "userId";
   private static final String CHALLENGE_1_KEY = "challenge1";
   private static final String LETTER_ID_KEY = "letter";
   private static final String VALID_1_KEY = "valid1";
   private static final String CHALLENGE_2_KEY = "challenge2";
   private static final String VALID_2_KEY = "valid2";
   private static final String DEVICE_INFO_KEY = "deviceInfo";

   public static MapifiedValues mapifyActivationSession(CrontoActivationSession session) {
      Mapifier mapifier = Mapifier.getInstance();
      return MapifiedValuesBuilder.mapifiedValues()
         .put("userId", session.getUserId().getValue())
         .putIfPresent("challenge1", session.getChallenge1().map(mapifier::mapify))
         .putIfPresent("letter", session.getLetterId())
         .put("valid1", session.isResponse1Valid())
         .putIfPresent("challenge2", session.getChallenge2().map(mapifier::mapify))
         .put("valid2", session.isResponse2Valid())
         .putIfPresent("deviceInfo", Optional.ofNullable(session.getDeviceInfo()).map(mapifier::mapify))
         .build();
   }

   public static CrontoActivationSession demapifyActivationSession(MapifiedValues values) {
      Mapifier mapifier = Mapifier.getInstance();
      return new CrontoActivationSession(
         values.simpleValue("userId", UserId::userId),
         values.demapifyOptional("challenge1", mapifier::demapify),
         values.getOptional("letter"),
         values.<Boolean>get("valid1"),
         values.demapifyOptional("challenge2", mapifier::demapify),
         values.<Boolean>get("valid2"),
         values.demapifyOptional("deviceInfo", mapifier::demapify).orElse(null)
      );
   }

   private CrontoActivationSessionMapificationUtils() {
   }
}
