package tv.pluto.grpc.age_ranges;

import static tv.pluto.ip.dal.agerange.AgeRanges.GetAllPagedRequest;

import com.plutotv.test.lib.LogUtils;
import io.grpc.Channel;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
import org.assertj.core.util.Streams;
import tv.pluto.grpc.GenericGrpcClient;
import tv.pluto.ip.dal.agerange.AgeRangeManagerGrpc;
import tv.pluto.ip.dal.agerange.AgeRanges;

public class AgeRangesClient extends GenericGrpcClient {

  private AgeRangeManagerGrpc.AgeRangeManagerBlockingStub blockingStub;

  private GetAllPagedRequest.Builder getAllPagedBuilder = GetAllPagedRequest.newBuilder();

  public AgeRangesClient(Channel channel) {
    blockingStub = AgeRangeManagerGrpc.newBlockingStub(channel);
    blockingStub = blockingStub.withInterceptors(CLIENT_INTERCEPTOR);
  }

  /**
   * Method represents gRPC method GetDocuments from <b>age_ranges.proto</b> file
   *
   * @return - Iterator with age ranges
   */
  public Iterator<AgeRanges.AgeRange> getDocuments() {
    LogUtils.logInfoMessage("Getting documents for age ranges");
    AgeRanges.GetDocumentsRequest request = AgeRanges.GetDocumentsRequest.newBuilder().build();

    return blockingStub.getDocuments(request);
  }

  public Iterator<AgeRanges.Id> cFeedsSyncAllIdsIterator() {
    AgeRanges.CFeedsSyncAllIdsRequest cFeedsSyncAllIdsRequest =
        AgeRanges.CFeedsSyncAllIdsRequest.newBuilder().build();
    return blockingStub.cFeedsSyncAllIds(cFeedsSyncAllIdsRequest);
  }

  public List<AgeRanges.AgeRange> getListCFeedsSyncDocsUpdatedAgeRange(String lastRun) {
    AgeRanges.CFeedsSyncDocumentsRequest request =
        AgeRanges.CFeedsSyncDocumentsRequest.newBuilder().setLastRunAt(lastRun).build();
    Iterator<AgeRanges.AgeRange> ageRangeIterator = blockingStub.cFeedsSyncDocuments(request);
    return Streams.stream(ageRangeIterator).collect(Collectors.toList());
  }

  public List<AgeRanges.GetAllPagedSort> grpcSort(String field) {
    return Collections.singletonList(
        AgeRanges.GetAllPagedSort.newBuilder().setField(field).setValue(1).build());
  }

  public List<AgeRanges.Filter> activeRegionsFilter(String field, String value, String type) {
    return Collections.singletonList(
        AgeRanges.Filter.newBuilder().setField(field).setValue(value).setType(type).build());
  }

  public AgeRanges.GetAllPagedResponse getAllPagedResponse(
      int limit,
      int offset,
      List<AgeRanges.GetAllPagedSort> ageRangeSort,
      List<AgeRanges.Filter> activeRegionsFilter) {
    GetAllPagedRequest getAllPagedRequest =
        getAllPagedBuilder
            .setLimit(limit)
            .setOffset(offset)
            .addAllSort(ageRangeSort)
            .addAllFilters(activeRegionsFilter)
            .build();

    return blockingStub.getAllPaged(getAllPagedRequest);
  }
}
