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

import com.airlock.iam.admin.api.domain.model.administrator.AdminEventSource;
import com.airlock.iam.airlock2fa.api.domain.model.Airlock2FADeviceDeleted;
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.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.DomainEventMapper;
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 java.util.Map;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.SubclassMapping;
import org.mapstruct.SubclassMappings;

@Mapper(uses = {CommonDomainEventMapper.class, FactorEventMapper.class})
public interface AdminappDomainEventMapper extends DomainEventMapper {
   @SubclassMappings(
      {
            @SubclassMapping(source = AuthenticationMethodChanged.class, target = EventPayloadData.class),
            @SubclassMapping(source = ContextDataChanged.class, target = EventPayloadData.class),
            @SubclassMapping(source = CrontoDeviceActivated.class, target = EventPayloadData.class),
            @SubclassMapping(source = CrontoDeviceDeleted.class, target = EventPayloadData.class),
            @SubclassMapping(source = CrontoLetterOrdered.class, target = EventPayloadData.class),
            @SubclassMapping(source = DeviceTokenDeleted.class, target = EventPayloadData.class),
            @SubclassMapping(source = DeviceTokenRegistered.class, target = EventPayloadData.class),
            @SubclassMapping(source = EmailAddressAdded.class, target = EventPayloadData.class),
            @SubclassMapping(source = EmailAddressChanged.class, target = EventPayloadData.class),
            @SubclassMapping(source = EmailAddressDeleted.class, target = EventPayloadData.class),
            @SubclassMapping(source = MtanTokenDeleted.class, target = EventPayloadData.class),
            @SubclassMapping(source = MtanTokenPhoneNumberChanged.class, target = EventPayloadData.class),
            @SubclassMapping(source = MtanTokenRegistered.class, target = EventPayloadData.class),
            @SubclassMapping(source = OathOtpSecretAdded.class, target = EventPayloadData.class),
            @SubclassMapping(source = OathOtpSecretViewed.class, target = EventPayloadData.class),
            @SubclassMapping(source = PasswordChanged.class, target = EventPayloadData.class),
            @SubclassMapping(source = PasswordLetterOrdered.class, target = EventPayloadData.class),
            @SubclassMapping(source = UserCreated.class, target = EventPayloadData.class),
            @SubclassMapping(source = UserDeleted.class, target = EventPayloadData.class),
            @SubclassMapping(source = UserLocked.class, target = EventPayloadData.class),
            @SubclassMapping(source = UserRolesChanged.class, target = EventPayloadData.class),
            @SubclassMapping(source = UserUnlocked.class, target = EventPayloadData.class),
            @SubclassMapping(source = FidoCredentialDeleted.class, target = EventPayloadData.class),
            @SubclassMapping(source = Airlock2FADeviceDeleted.class, target = EventPayloadData.class)
      }
   )
   @Mapping(target = "data", source = "event", qualifiedByName = "defaultMapping")
   EventPayloadData toEventPayloadData(DomainEvent var1);

   @SubclassMappings(
      {
            @SubclassMapping(source = AdminEventSource.class, target = EventPayloadSource.class),
            @SubclassMapping(source = UnknownEventSource.class, target = EventPayloadSource.class)
      }
   )
   @Mapping(target = "source", source = "source", qualifiedByName = "defaultSourceMapping")
   EventPayloadSource toEventPayloadSource(EventSource var1);

   default EventPayloadSource mapAdminEventSource(AdminEventSource source) {
      return new EventPayloadSource(Map.of("sourceType", "adminapp", "adminId", source.adminId().getValue()));
   }
}
