package com.airlock.iam.base.infrastructure.mapper.jsonapi;

import ch.ergon.restal.jsonapi.document.data.ResourceObject;
import com.airlock.iam.base.infrastructure.mapper.FieldMapper;
import com.google.common.base.Preconditions;
import java.util.List;
import java.util.Optional;
import org.apache.commons.lang3.Strings;

public final class JsonApiResourceObjectArrayFieldMapper<T> implements FieldMapper {
   private final List<ResourceObject<T>> requestData;

   private JsonApiResourceObjectArrayFieldMapper(List<ResourceObject<T>> requestData) {
      Preconditions.checkNotNull(requestData);
      this.requestData = requestData;
   }

   @Override
   public String map(String modelField) {
      Optional<Integer> index = this.findIndex(modelField);
      return index.isPresent() ? "/data[" + index.get() + "]/id" : "/data";
   }

   private Optional<Integer> findIndex(String modelField) {
      for (int i = 0; i < this.requestData.size(); i++) {
         String id = this.requestData.get(i).getId();
         if (Strings.CS.equals(id, modelField)) {
            return Optional.of(i);
         }
      }

      return Optional.empty();
   }

   public static <T> JsonApiResourceObjectArrayFieldMapper<T> withRequestData(List<ResourceObject<T>> requestData) {
      return new JsonApiResourceObjectArrayFieldMapper<>(requestData);
   }
}
