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

import com.airlock.iam.authentication.infrastructure.transfer.response.UserDataEditItemInfoAuthResponseAttributesData;
import com.airlock.iam.authentication.infrastructure.transfer.response.UserDataItemValidationAuthData;
import com.airlock.iam.flow.shared.api.domain.model.item.info.UserDataItemInfo;
import com.airlock.iam.flow.shared.api.domain.model.item.info.UserDataItemType;
import java.util.List;
import java.util.stream.Collectors;
import ma.glasnost.orika.CustomConverter;
import ma.glasnost.orika.MappingContext;
import ma.glasnost.orika.metadata.Type;

public final class UserDataItemInfoConverter<T> extends CustomConverter<UserDataItemInfo<T>, UserDataEditItemInfoAuthResponseAttributesData> {
   public UserDataEditItemInfoAuthResponseAttributesData convert(
      UserDataItemInfo<T> source, Type<? extends UserDataEditItemInfoAuthResponseAttributesData> destinationType, MappingContext mappingContext
   ) {
      T currentValue = source.getCurrentValue().orElse(null);
      String type = source.getType().map(UserDataItemType::getId).orElse(null);
      Boolean required = source.getRequired().orElse(null);
      List<String> allowedValues = source.getAllowedValues();
      List<UserDataItemValidationAuthData> validations = source.getValidationInfos()
         .stream()
         .map(v -> new UserDataItemValidationAuthData(v.type(), v.parameters()))
         .collect(Collectors.toList());
      if (validations.isEmpty()) {
         validations = null;
      }

      if (allowedValues.isEmpty()) {
         allowedValues = null;
      }

      return new UserDataEditItemInfoAuthResponseAttributesData(currentValue, required, type, source.getInputPurpose().orElse(null), validations, allowedValues);
   }
}
