package com.airlock.iam.flow.shared.infrastructure.session;

import com.airlock.iam.base.misc.result.Result;
import com.airlock.iam.common.domain.model.state.SessionStateId;
import com.airlock.iam.common.infrastructure.exceptions.DeserializationFailedType;
import com.airlock.iam.flow.shared.domain.model.session.FlowBasedIamSession;
import java.util.Optional;

public interface FlowBasedIamSessionSerializer {
   String serializeSession(FlowBasedIamSession var1);

   Result<FlowBasedIamSession, FlowBasedIamSessionSerializer.DeserializationFailedResult> deserializeSession(Optional<SessionStateId> var1, String var2);

   record DeserializationFailedResult(DeserializationFailedType type, String message, Optional<FlowBasedIamSession> session) {
      public static FlowBasedIamSessionSerializer.DeserializationFailedResult sessionNotDeserializable(String message) {
         return new FlowBasedIamSessionSerializer.DeserializationFailedResult(DeserializationFailedType.SESSION_NOT_DESERIALIZABLE, message, Optional.empty());
      }

      public static FlowBasedIamSessionSerializer.DeserializationFailedResult flowFromOldVersion(String message, FlowBasedIamSession userSession) {
         return new FlowBasedIamSessionSerializer.DeserializationFailedResult(
            DeserializationFailedType.FLOW_FROM_OLD_VERSION, message, Optional.of(userSession)
         );
      }
   }
}
