/*
 * (c) 2020 Pluto Inc.
 */
package tv.pluto.grpc.devices;

import static tv.pluto.ip.dal.device.Devices.GetDocumentsUpdatedBetweenDatesRequest;

import io.grpc.Channel;
import tv.pluto.grpc.GenericGrpcClient;
import tv.pluto.ip.dal.device.DeviceManagerGrpc;
import tv.pluto.ip.dal.device.Devices;

public class DevicesClient extends GenericGrpcClient {
  private Devices.GetAllPagedRequest.Builder getAllPagedBuilder =
      Devices.GetAllPagedRequest.newBuilder();
  private DeviceManagerGrpc.DeviceManagerBlockingStub blockingStub;
  private DeviceManagerGrpc.DeviceManagerBlockingStub blockingStubNoMeta;

  public DevicesClient(Channel channel, boolean auth) {
    blockingStub = DeviceManagerGrpc.newBlockingStub(channel);
    blockingStub = blockingStub.withInterceptors(CLIENT_INTERCEPTOR);

    if (auth) blockingStub = blockingStub.withInterceptors(CLIENT_INTERCEPTOR_AUTH);
    else blockingStub = blockingStub.withInterceptors(CLIENT_INTERCEPTOR);

    this.getDocumentsUpdatedBetweenDatesRequestBuilder =
        GetDocumentsUpdatedBetweenDatesRequest.newBuilder();
  }

  public DevicesClient(Channel channel) {
    // no metadata
    blockingStubNoMeta = DeviceManagerGrpc.newBlockingStub(channel);
  }

  public Devices.GetByIdResponse getById(String id) {
    Devices.GetByIdRequest request = Devices.GetByIdRequest.newBuilder().setId(id).build();
    return blockingStub.getById(request);
  }

  public Devices.CreateResponse create(Devices.CreateRequest request) {
    return blockingStub.create(request);
  }

  public Devices.UpdateFieldsResponse update(Devices.UpdateFieldsRequest request) {
    return blockingStub.updateFields(request);
  }

  public Devices.UpdateFieldsResponse updateNoMeta(Devices.UpdateFieldsRequest request) {
    return blockingStubNoMeta.updateFields(request);
  }
}
