package com.airlock.iam.factor.infrastructure.mapper;

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.base.misc.collection.IamMaps;
import com.airlock.iam.common.infrastructure.event.EventPayloadData;
import com.airlock.iam.common.infrastructure.mapper.event.CommonDomainEventMapper;
import com.airlock.iam.fido.api.domain.model.event.FidoCredentialDeleted;
import com.airlock.iam.fido.api.domain.model.event.FidoCredentialRegistered;
import java.util.Map;
import org.mapstruct.Mapper;

@Mapper
public interface FactorEventMapper {
   default EventPayloadData mapFidoCredentialDeleted(FidoCredentialDeleted event) {
      return new EventPayloadData(
         IamMaps.mergeMaps(CommonDomainEventMapper.mapAuthenticationDeviceEvent(event), Map.of("fidoCredentialId", event.credentialId().asString()))
      );
   }

   default EventPayloadData mapFidoCredentialRegistered(FidoCredentialRegistered event) {
      return new EventPayloadData(
         IamMaps.mergeMaps(
            CommonDomainEventMapper.mapAuthenticationDeviceEvent(event),
            Map.of("fidoCredentialId", event.credentialId().asString(), "fidoRelyingPartyId", event.relyingPartyId().getId())
         )
      );
   }

   default EventPayloadData mapAirlock2FADeviceActivated(Airlock2FADeviceActivated event) {
      return new EventPayloadData(
         IamMaps.mergeMaps(
            CommonDomainEventMapper.mapAuthenticationDeviceEvent(event),
            Map.of("airlock2faAccountId", event.accountId().getId(), "airlock2faDeviceId", event.deviceId().id())
         )
      );
   }

   default EventPayloadData mapAirlock2FADeviceDeleted(Airlock2FADeviceDeleted event) {
      return new EventPayloadData(
         IamMaps.mergeMaps(
            CommonDomainEventMapper.mapAuthenticationDeviceEvent(event),
            Map.of("airlock2faAccountId", event.accountId().getId(), "airlock2faDeviceId", event.deviceId().id())
         )
      );
   }

   default EventPayloadData mapAirlock2FADeviceInCooldownUsed(Airlock2FADeviceInCooldownUsed event) {
      return new EventPayloadData(
         IamMaps.mergeMaps(
            CommonDomainEventMapper.mapAuthenticationDeviceEvent(event),
            Map.of("airlock2faAccountId", event.accountId().getId(), "airlock2faDeviceId", event.deviceId().id())
         )
      );
   }
}
