package com.airlock.iam.saml2.infrastructure.state;

import com.airlock.iam.base.api.domain.model.mapification.MapifiedValues;
import com.airlock.iam.base.domain.model.mapification.MapifiedValuesBuilder;
import com.airlock.iam.base.misc.json.JsonCoding;
import com.airlock.iam.saml2.domain.model.idp.logout.Saml2SpInitiatedSloAttributes;
import com.airlock.iam.saml2.domain.model.session.FlowFederationSession;
import com.airlock.iam.saml2.infrastructure.idp.logout.Saml2SpInitiatedSloCache;

public final class Saml2SpInitiatedSloCacheEntrySerializer implements Serializer<Saml2SpInitiatedSloCache.Saml2SpInitiatedSloCacheEntry> {
   private static final String SESSION_KEY = "session";
   private static final String ATTRIBUTES_KEY = "attributes";

   public String mapToStore(Saml2SpInitiatedSloCache.Saml2SpInitiatedSloCacheEntry value) {
      return JsonCoding.toJson(
         MapifiedValuesBuilder.mapifiedValues()
            .put("session", value.federationSession().mapify())
            .put("attributes", value.attributes().mapify())
            .build()
            .asMap()
      );
   }

   public Saml2SpInitiatedSloCache.Saml2SpInitiatedSloCacheEntry mapFromStore(String serialized) {
      MapifiedValues values = new MapifiedValues(JsonCoding.fromJson(serialized));
      return new Saml2SpInitiatedSloCache.Saml2SpInitiatedSloCacheEntry(
         values.demapifyValue("session", FlowFederationSession::demapify), values.demapifyValue("attributes", Saml2SpInitiatedSloAttributes::demapify)
      );
   }
}
