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

import com.airlock.iam.apipolicyservice.domain.model.ApiPolicyServiceSubscription;
import com.airlock.iam.apipolicyservice.infrastructure.transfer.response.ApiPolicyServicePlanUsageData;
import com.airlock.iam.apipolicyservice.infrastructure.transfer.response.ApiPolicyServiceSubscriptionData;
import java.util.HashMap;
import java.util.Map;
import ma.glasnost.orika.CustomConverter;
import ma.glasnost.orika.MappingContext;
import ma.glasnost.orika.metadata.Type;

public class SubscriptionConverter extends CustomConverter<ApiPolicyServiceSubscription, ApiPolicyServiceSubscriptionData> {
   public static final String ID = "SubscriptionConverter";

   public ApiPolicyServiceSubscriptionData convert(
      ApiPolicyServiceSubscription source, Type<? extends ApiPolicyServiceSubscriptionData> destinationType, MappingContext mappingContext
   ) {
      if (source == null) {
         return new ApiPolicyServiceSubscriptionData(null, null);
      }

      Map<String, ApiPolicyServicePlanUsageData> plans = source.getPlans()
         .stream()
         .collect(HashMap::new, (m, p) -> m.put(p.getName(), this.toPlanUsage(p.getRateLimit())), Map::putAll);
      return new ApiPolicyServiceSubscriptionData(source.getId().asString(), plans);
   }

   private ApiPolicyServicePlanUsageData toPlanUsage(Integer rateLimit) {
      return new ApiPolicyServicePlanUsageData(rateLimit);
   }
}
