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

import com.airlock.iam.flow.domain.model.event.StateMachineFlowEvent;
import com.airlock.iam.flow.domain.model.statemachine.FlowState;
import com.airlock.iam.flow.infrastructure.serialization.FlowStateMachinePersist;
import com.airlock.iam.flow.infrastructure.serialization.SerializedStateMachineContext;
import com.airlock.iam.flow.infrastructure.serialization.StateMachineSerializer;
import com.airlock.iam.flow.infrastructure.serialization.StateMachineSerializerImpl;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import com.google.inject.servlet.RequestScoped;
import org.springframework.statemachine.persist.DefaultStateMachinePersister;
import org.springframework.statemachine.persist.StateMachinePersister;

public final class StateMachineSerializationModule extends PrivateModule {
   @Provides
   @RequestScoped
   StateMachinePersister<FlowState, StateMachineFlowEvent, SerializedStateMachineContext> provideStateMachinePersister(FlowStateMachinePersist persist) {
      return new DefaultStateMachinePersister(persist);
   }

   protected void configure() {
      this.bind(StateMachineSerializer.class).to(StateMachineSerializerImpl.class).in(RequestScoped.class);
      this.expose(StateMachineSerializer.class);
   }
}
