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

import com.airlock.iam.common.domain.model.e2ee.JwePublicE2eEncryptionInformation;
import com.airlock.iam.flow.infrastructure.mapper.FlowIdConverter;
import com.airlock.iam.flow.infrastructure.mapper.StepActionConverter;
import com.airlock.iam.flow.shared.domain.model.captcha.CustomCaptcha;
import com.airlock.iam.flow.shared.domain.model.captcha.HCaptcha;
import com.airlock.iam.flow.shared.domain.model.captcha.ReCaptcha;
import com.airlock.iam.flow.shared.infrastructure.transfer.response.CustomCaptchaChallengeData;
import com.airlock.iam.flow.shared.infrastructure.transfer.response.HCaptchaChallengeData;
import com.airlock.iam.flow.shared.infrastructure.transfer.response.JwePublicE2eEncryptionInformationData;
import com.airlock.iam.flow.shared.infrastructure.transfer.response.ReCaptchaChallengeData;
import ma.glasnost.orika.CustomMapper;
import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.MappingContext;
import ma.glasnost.orika.converter.ConverterFactory;

public final class FlowSharedRestBeanMappings {
   public FlowSharedRestBeanMappings(MapperFactory factory) {
      this.configureAll(factory);
   }

   private void configureAll(MapperFactory factory) {
      ConverterFactory converterFactory = factory.getConverterFactory();
      converterFactory.registerConverter(new FlowIdConverter());
      converterFactory.registerConverter(new StepActionConverter());
      configureJwePublicE2eEncryptionInformation(factory);
      configureCaptchaMappings(factory);
   }

   private static void configureCaptchaMappings(MapperFactory factory) {
      factory.classMap(ReCaptcha.ReCaptchaChallenge.class, ReCaptchaChallengeData.class)
         .customize(new FlowSharedRestBeanMappings.ReCaptchaChallengeMapper())
         .register();
      factory.classMap(HCaptcha.HCaptchaChallenge.class, HCaptchaChallengeData.class)
         .customize(new FlowSharedRestBeanMappings.HCaptchaChallengeMapper())
         .register();
      factory.classMap(CustomCaptcha.CustomCaptchaChallenge.class, CustomCaptchaChallengeData.class)
         .customize(new FlowSharedRestBeanMappings.CustomCaptchaChallengeMapper())
         .register();
   }

   private static void configureJwePublicE2eEncryptionInformation(MapperFactory factory) {
      factory.classMap(JwePublicE2eEncryptionInformation.class, JwePublicE2eEncryptionInformationData.class)
         .customize(new FlowSharedRestBeanMappings.JwePublicE2eEncryptionInformationMapper())
         .register();
   }

   private static final class CustomCaptchaChallengeMapper extends CustomMapper<CustomCaptcha.CustomCaptchaChallenge, CustomCaptchaChallengeData> {
      public void mapAtoB(CustomCaptcha.CustomCaptchaChallenge challenge, CustomCaptchaChallengeData data, MappingContext context) {
         data.setType(challenge.type());
         data.setKey(challenge.key());
      }
   }

   private static final class HCaptchaChallengeMapper extends CustomMapper<HCaptcha.HCaptchaChallenge, HCaptchaChallengeData> {
      public void mapAtoB(HCaptcha.HCaptchaChallenge challenge, HCaptchaChallengeData data, MappingContext context) {
         data.setType(challenge.type());
         data.setKey(challenge.key());
      }
   }

   private static final class JwePublicE2eEncryptionInformationMapper
      extends CustomMapper<JwePublicE2eEncryptionInformation, JwePublicE2eEncryptionInformationData> {
      public void mapAtoB(JwePublicE2eEncryptionInformation info, JwePublicE2eEncryptionInformationData data, MappingContext context) {
         data.setNonce(info.getNonce());
         data.setPublicKey(info.getPublicKey());
      }
   }

   private static final class ReCaptchaChallengeMapper extends CustomMapper<ReCaptcha.ReCaptchaChallenge, ReCaptchaChallengeData> {
      public void mapAtoB(ReCaptcha.ReCaptchaChallenge challenge, ReCaptchaChallengeData data, MappingContext context) {
         data.setType(challenge.type());
         data.setKey(challenge.key());
      }
   }
}
