package com.airlock.iam.login.app.infrastructure.event;

import com.airlock.iam.airlock2fa.api.domain.model.Airlock2FADeviceActivated;
import com.airlock.iam.airlock2fa.api.domain.model.Airlock2FADeviceDeleted;
import com.airlock.iam.airlock2fa.api.domain.model.Airlock2FADeviceInCooldownUsed;
import com.airlock.iam.authentication.api.domain.model.event.AuthenticationFlowSuccessfullyCompleted;
import com.airlock.iam.authentication.infrastructure.mapper.AuthenticationEventMapper;
import com.airlock.iam.base.api.domain.model.event.DomainEvent;
import com.airlock.iam.base.api.domain.model.event.source.EventSource;
import com.airlock.iam.base.domain.model.event.UnknownEventSource;
import com.airlock.iam.common.api.domain.model.event.AuthenticationMethodChanged;
import com.airlock.iam.common.api.domain.model.event.ContextDataChanged;
import com.airlock.iam.common.api.domain.model.event.CrontoDeviceActivated;
import com.airlock.iam.common.api.domain.model.event.CrontoDeviceDeleted;
import com.airlock.iam.common.api.domain.model.event.CrontoLetterOrdered;
import com.airlock.iam.common.api.domain.model.event.DeviceTokenDeleted;
import com.airlock.iam.common.api.domain.model.event.DeviceTokenRegistered;
import com.airlock.iam.common.api.domain.model.event.EmailAddressAdded;
import com.airlock.iam.common.api.domain.model.event.EmailAddressChanged;
import com.airlock.iam.common.api.domain.model.event.EmailAddressDeleted;
import com.airlock.iam.common.api.domain.model.event.LoginFromNewDeviceEvent;
import com.airlock.iam.common.api.domain.model.event.MtanTokenDeleted;
import com.airlock.iam.common.api.domain.model.event.MtanTokenPhoneNumberChanged;
import com.airlock.iam.common.api.domain.model.event.MtanTokenRegistered;
import com.airlock.iam.common.api.domain.model.event.OathOtpSecretAdded;
import com.airlock.iam.common.api.domain.model.event.OathOtpSecretViewed;
import com.airlock.iam.common.api.domain.model.event.PasswordChanged;
import com.airlock.iam.common.api.domain.model.event.PasswordLetterOrdered;
import com.airlock.iam.common.api.domain.model.event.UserCreated;
import com.airlock.iam.common.api.domain.model.event.UserDeleted;
import com.airlock.iam.common.api.domain.model.event.UserLocked;
import com.airlock.iam.common.api.domain.model.event.UserRolesChanged;
import com.airlock.iam.common.api.domain.model.event.UserUnlocked;
import com.airlock.iam.common.infrastructure.event.EventPayloadData;
import com.airlock.iam.common.infrastructure.event.EventPayloadSource;
import com.airlock.iam.common.infrastructure.mapper.event.CommonDomainEventMapper;
import com.airlock.iam.factor.infrastructure.mapper.FactorEventMapper;
import com.airlock.iam.fido.api.domain.model.event.FidoCredentialDeleted;
import com.airlock.iam.fido.api.domain.model.event.FidoCredentialRegistered;
import com.airlock.iam.flow.api.domain.model.event.FlowEventSource;
import com.airlock.iam.flow.domain.model.event.GenericStepResultEvent;
import com.airlock.iam.flow.shared.infrastructure.mapper.FlowEventMapper;
import com.airlock.iam.login.api.domain.model.event.SessionlessRestEndpointEventSource;
import com.airlock.iam.oauth2.api.domain.model.event.OAuth2UserConsentEvent;
import com.airlock.iam.oauth2.infrastructure.mapper.OAuth2EventMapper;
import java.util.Map;
import org.mapstruct.factory.Mappers;

public class LoginappDomainEventMapperImpl implements LoginappDomainEventMapper {
   private final CommonDomainEventMapper commonDomainEventMapper = (CommonDomainEventMapper)Mappers.getMapper(CommonDomainEventMapper.class);
   private final FactorEventMapper factorEventMapper = (FactorEventMapper)Mappers.getMapper(FactorEventMapper.class);
   private final OAuth2EventMapper oAuth2EventMapper = (OAuth2EventMapper)Mappers.getMapper(OAuth2EventMapper.class);
   private final AuthenticationEventMapper authenticationEventMapper = (AuthenticationEventMapper)Mappers.getMapper(AuthenticationEventMapper.class);
   private final FlowEventMapper flowEventMapper = (FlowEventMapper)Mappers.getMapper(FlowEventMapper.class);

   @Override
   public EventPayloadData toEventPayloadData(DomainEvent event) {
      if (event == null) {
         return null;
      }

      if (event instanceof AuthenticationMethodChanged) {
         return this.commonDomainEventMapper.mapAuthenticationMethodChanged((AuthenticationMethodChanged)event);
      }

      if (event instanceof ContextDataChanged) {
         return this.commonDomainEventMapper.mapContextDataChanged((ContextDataChanged)event);
      }

      if (event instanceof CrontoDeviceActivated) {
         return this.commonDomainEventMapper.mapCrontoDeviceActivated((CrontoDeviceActivated)event);
      }

      if (event instanceof CrontoDeviceDeleted) {
         return this.commonDomainEventMapper.mapCrontoDeviceDeleted((CrontoDeviceDeleted)event);
      }

      if (event instanceof CrontoLetterOrdered) {
         return this.commonDomainEventMapper.mapCrontoLetterOrdered((CrontoLetterOrdered)event);
      }

      if (event instanceof DeviceTokenDeleted) {
         return this.commonDomainEventMapper.mapDeviceTokenDeleted((DeviceTokenDeleted)event);
      }

      if (event instanceof DeviceTokenRegistered) {
         return this.commonDomainEventMapper.mapDeviceTokenRegistered((DeviceTokenRegistered)event);
      }

      if (event instanceof EmailAddressAdded) {
         return this.commonDomainEventMapper.mapEmailAddressAdded((EmailAddressAdded)event);
      }

      if (event instanceof EmailAddressChanged) {
         return this.commonDomainEventMapper.mapEmailAddressChanged((EmailAddressChanged)event);
      }

      if (event instanceof EmailAddressDeleted) {
         return this.commonDomainEventMapper.mapEmailAddressDeleted((EmailAddressDeleted)event);
      }

      if (event instanceof MtanTokenDeleted) {
         return this.commonDomainEventMapper.mapMtanTokenDeleted((MtanTokenDeleted)event);
      }

      if (event instanceof MtanTokenRegistered) {
         return this.commonDomainEventMapper.mapMtanTokenRegistered((MtanTokenRegistered)event);
      }

      if (event instanceof MtanTokenPhoneNumberChanged) {
         return this.commonDomainEventMapper.mapMtanTokenPhoneNumberChanged((MtanTokenPhoneNumberChanged)event);
      }

      if (event instanceof OathOtpSecretAdded) {
         return this.commonDomainEventMapper.mapMapOathOtpSecretAdded((OathOtpSecretAdded)event);
      }

      if (event instanceof OathOtpSecretViewed) {
         return this.commonDomainEventMapper.mapOathOtpSecretViewed((OathOtpSecretViewed)event);
      }

      if (event instanceof PasswordChanged) {
         return this.commonDomainEventMapper.mapPasswordChanged((PasswordChanged)event);
      }

      if (event instanceof PasswordLetterOrdered) {
         return this.commonDomainEventMapper.mapPasswordLetterOrdered((PasswordLetterOrdered)event);
      }

      if (event instanceof UserCreated) {
         return this.commonDomainEventMapper.mapUserCreated((UserCreated)event);
      }

      if (event instanceof UserDeleted) {
         return this.commonDomainEventMapper.mapUserDeleted((UserDeleted)event);
      }

      if (event instanceof UserLocked) {
         return this.commonDomainEventMapper.mapUserLocked((UserLocked)event);
      }

      if (event instanceof UserUnlocked) {
         return this.commonDomainEventMapper.mapUserUnlocked((UserUnlocked)event);
      }

      if (event instanceof UserRolesChanged) {
         return this.commonDomainEventMapper.mapUserRolesChanged((UserRolesChanged)event);
      }

      if (event instanceof GenericStepResultEvent) {
         return this.flowEventMapper.mapGenericStepResultEvent((GenericStepResultEvent)event);
      }

      if (event instanceof FidoCredentialDeleted) {
         return this.factorEventMapper.mapFidoCredentialDeleted((FidoCredentialDeleted)event);
      }

      if (event instanceof FidoCredentialRegistered) {
         return this.factorEventMapper.mapFidoCredentialRegistered((FidoCredentialRegistered)event);
      }

      if (event instanceof Airlock2FADeviceActivated) {
         return this.factorEventMapper.mapAirlock2FADeviceActivated((Airlock2FADeviceActivated)event);
      }

      if (event instanceof Airlock2FADeviceDeleted) {
         return this.factorEventMapper.mapAirlock2FADeviceDeleted((Airlock2FADeviceDeleted)event);
      }

      if (event instanceof Airlock2FADeviceInCooldownUsed) {
         return this.factorEventMapper.mapAirlock2FADeviceInCooldownUsed((Airlock2FADeviceInCooldownUsed)event);
      }

      if (event instanceof OAuth2UserConsentEvent) {
         return this.oAuth2EventMapper.mapOAuth2UserConsent((OAuth2UserConsentEvent)event);
      }

      if (event instanceof AuthenticationFlowSuccessfullyCompleted) {
         return this.authenticationEventMapper.mapAuthenticationFlowSuccessfullyCompleted((AuthenticationFlowSuccessfullyCompleted)event);
      }

      if (event instanceof LoginFromNewDeviceEvent) {
         return this.authenticationEventMapper.mapLoginFromNewDevice((LoginFromNewDeviceEvent)event);
      }

      Map<String, Object> data = null;
      data = this.defaultMapping(event);
      return new EventPayloadData(data);
   }

   @Override
   public EventPayloadSource toEventPayloadSource(EventSource source) {
      if (source == null) {
         return null;
      }

      if (source instanceof FlowEventSource) {
         return this.flowEventMapper.mapFlowEventSource((FlowEventSource)source);
      }

      if (source instanceof SessionlessRestEndpointEventSource) {
         return this.mapSessionlessRestEndpointEventSource((SessionlessRestEndpointEventSource)source);
      }

      if (source instanceof UnknownEventSource) {
         return this.commonDomainEventMapper.mapUnknownEventSource((UnknownEventSource)source);
      }

      Map<String, Object> source1 = null;
      source1 = this.defaultSourceMapping(source);
      return new EventPayloadSource(source1);
   }
}
