package tv.pluto.grpc.publishing_users;

import com.plutotv.test.lib.LogUtils;
import io.grpc.Channel;
import java.util.List;
import java.util.logging.Logger;
import tv.pluto.grpc.GenericGrpcClient;
import tv.pluto.ip.dal.publishinguser.PublishingUserManagerGrpc;
import tv.pluto.ip.dal.publishinguser.PublishingUserManagerGrpc.PublishingUserManagerBlockingStub;
import tv.pluto.ip.dal.publishinguser.PublishingUsers;
import tv.pluto.ip.dal.publishinguser.PublishingUsers.GetByIdRequest;
import tv.pluto.ip.dal.publishinguser.PublishingUsers.GetByIdResponse;
import tv.pluto.ip.dal.publishinguser.PublishingUsers.GetByIdsRequest;
import tv.pluto.ip.dal.publishinguser.PublishingUsers.GetByIdsResponse;
import tv.pluto.ip.dal.publishinguser.PublishingUsers.PublishingUser;
// import publishinguserpackage.PublishingUsers.CreateRequest;
// import publishinguserpackage.PublishingUsers.CreateResponse;
import tv.pluto.ip.dal.publishinguser.PublishingUsers.UpdateFieldsRequest;
import tv.pluto.ip.dal.publishinguser.PublishingUsers.UpdateFieldsResponse;

public class PublishingUsersClient extends GenericGrpcClient {

  private static final Logger logger = Logger.getLogger(PublishingUsersClient.class.getName());

  private PublishingUserManagerBlockingStub blockingStub;

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

  public PublishingUsersClient(Channel channel, boolean auth) {
    if (auth) {
      blockingStub = PublishingUserManagerGrpc.newBlockingStub(channel);
      blockingStub = blockingStub.withInterceptors(CLIENT_INTERCEPTOR_AUTH);
    } else {
      blockingStub = PublishingUserManagerGrpc.newBlockingStub(channel);
      blockingStub = blockingStub.withInterceptors(CLIENT_INTERCEPTOR);
    }
  }

  /**
   * Method represents gRPC method GetById from <b>publishing_users.proto</b> file
   *
   * @param id id of the user
   * @return GetByIdResponse object
   */
  public GetByIdResponse getById(String id) {
    logger.info("Getting info for user with id: " + id + " ...");
    GetByIdRequest request = GetByIdRequest.newBuilder().setId(id).build();

    return blockingStub.getById(request);
  }

  /**
   * Method represents gRPC method GetByIds from <b>publishing_users.proto</b> file
   *
   * @param partnersIds List of users ids to search
   * @return GetByIdsResponse object
   */
  public GetByIdsResponse getByIds(List<String> partnersIds) {
    logger.info("Getting list of users for ids: " + partnersIds + " ...");

    GetByIdsRequest request = GetByIdsRequest.newBuilder().addAllIds(partnersIds).build();

    return blockingStub.getByIds(request);
  }

  /**
   * Method represents gRPC method UpdateFields from <b>publishing_users.proto</b> file
   *
   * @param id - ID of clip for update
   * @param publishingUser - User objects with set fields for update
   * @param updateFields - List of fields which will be updated
   * @return UpdateFieldsResponse
   */
  public UpdateFieldsResponse updateFields(
      String id, PublishingUser publishingUser, List<String> updateFields) {
    LogUtils.logInfoMessage(
        "Update publishingUser with ID="
            + id
            + "\n publishingUser object "
            + publishingUser
            + "\n update fields list "
            + updateFields);

    PublishingUsers.UpdateFieldsRequest request =
        UpdateFieldsRequest.newBuilder()
            .setId(id)
            .setDocument(publishingUser)
            .addAllUpdateFields(updateFields)
            .build();

    return blockingStub.updateFields(request);
  }

  //    public CreateResponse create(PublishingUser publishingUser) {
  //        CreateRequest request = CreateRequest.newBuilder()
  //                .setDocument(publishingUser)
  //                .build();
  //
  //        return blockingStub.create(request);
  //    }
}
