package com.l7tech.policy.code;

import com.fasterxml.jackson.databind.module.SimpleModule;
import com.l7tech.policy.AssertionRegistry;
import com.l7tech.policy.CustomAssertionRegistry;
import com.l7tech.policy.assertion.Assertion;
import com.l7tech.policy.assertion.CustomAssertionHolder;
import com.l7tech.policy.assertion.composite.CompositeAssertion;
import com.l7tech.policy.code.config.PolicyCodeConfig;
import com.l7tech.policy.code.config.PolicyCodeConfigBuilder;
import com.l7tech.policy.code.deserializer.AssertionDeserializer;
import com.l7tech.policy.code.deserializer.CompositeAssertionDeserializer;
import com.l7tech.policy.code.deserializer.CustomAssertionDeserializer;
import com.l7tech.policy.code.serializer.AssertionSerializer;
import com.l7tech.policy.code.serializer.CompositeAssertionSerializer;
import com.l7tech.policy.code.serializer.CustomAssertionSerializer;
import com.l7tech.util.Config;

public class PolicyCodeModuleProvider {
   protected final SimpleModule module = new SimpleModule();
   protected final PolicyCodeConfig codeConfig;

   public PolicyCodeModuleProvider(PolicyCodeConfig var1) {
      this.codeConfig = var1;
      this.initialize();
   }

   public PolicyCodeModuleProvider(AssertionRegistry var1, CustomAssertionRegistry var2, Config var3) {
      this(PolicyCodeConfigBuilder.getBuilder().assertionRegistry(var1).customAssertionRegistry(var2).serverConfig(var3).build());
   }

   public SimpleModule getPolicyCodeModule() {
      return this.module;
   }

   public PolicyCodeConfig getCodeConfig() {
      return this.codeConfig;
   }

   protected void initialize() {
      this.module.addSerializer(Assertion.class, new AssertionSerializer(this.codeConfig));
      this.module.addSerializer(CompositeAssertion.class, new CompositeAssertionSerializer(this.codeConfig));
      this.module.addSerializer(CustomAssertionHolder.class, new CustomAssertionSerializer(this.codeConfig));
      this.module.addDeserializer(Assertion.class, new AssertionDeserializer(this.codeConfig));
      this.module.addDeserializer(CompositeAssertion.class, new CompositeAssertionDeserializer(this.codeConfig));
      this.module.addDeserializer(CustomAssertionHolder.class, new CustomAssertionDeserializer(this.codeConfig));
   }
}
