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

import com.airlock.iam.authentication.infrastructure.transfer.response.CrontoChallengeData;
import com.airlock.iam.flow.shared.domain.model.cronto.CrontoAuthChallenge;
import com.airlock.iam.flow.shared.domain.model.cronto.CrontoPushDevice;
import ma.glasnost.orika.CustomConverter;
import ma.glasnost.orika.MappingContext;
import ma.glasnost.orika.metadata.Type;
import ma.glasnost.orika.metadata.TypeFactory;

public final class CrontoChallengeConverter extends CustomConverter<CrontoAuthChallenge, CrontoChallengeData> {
   public CrontoChallengeData convert(CrontoAuthChallenge source, Type<? extends CrontoChallengeData> destinationType, MappingContext mappingContext) {
      return CrontoChallengeData.builder()
         .challengeImage(source.getBase64Cryptogram())
         .secureChannelChallenge(source.getSecureChannelChallenge().orElse("-"))
         .onlineValidation(source.isOnlineValidation())
         .pushed(source.isPushed())
         .pushLoginId(source.getPushLoginId().orElse(null))
         .pushDevices(source.getPushDevices().stream().map(CrontoChallengeConverter::convert).toList())
         .build();
   }

   public boolean canConvert(Type<?> sourceType, Type<?> destinationType) {
      Type<Object> objectType = TypeFactory.valueOf(Object.class);
      Type<CrontoChallengeData> crontoChallengeDataType = TypeFactory.valueOf(CrontoChallengeData.class);
      return this.sourceType.equals(sourceType) && (destinationType.equals(objectType) || destinationType.equals(crontoChallengeDataType));
   }

   private static CrontoChallengeData.CrontoChallengePushDeviceData convert(CrontoPushDevice crontoPushDevice) {
      return CrontoChallengeData.CrontoChallengePushDeviceData.builder()
         .id(crontoPushDevice.id())
         .label(crontoPushDevice.label().orElse(null))
         .platform(crontoPushDevice.platform().orElse(null))
         .build();
   }
}
