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

import io.grpc.Channel;
import io.grpc.Metadata;
import java.util.List;
import java.util.logging.Logger;
import tv.pluto.grpc.GenericGrpcClient;
import tv.pluto.ip.dal.placeholder.Placeholder;
import tv.pluto.ip.dal.placeholder.PlaceholderManagerGrpc;

/** Class represents gRPC client for <b>placeholder.proto</b> file */
public class PlaceholderClient extends GenericGrpcClient {
  private static final Logger logger = Logger.getLogger(PlaceholderClient.class.getName());

  private PlaceholderManagerGrpc.PlaceholderManagerBlockingStub blockingStub;

  public PlaceholderClient(Channel channel) {
    // create a custom header
    Metadata header = new Metadata();
    Metadata.Key<String> key = Metadata.Key.of("app_name", Metadata.ASCII_STRING_MARSHALLER);
    header.put(key, "automation_tests");

    blockingStub = PlaceholderManagerGrpc.newBlockingStub(channel);
    blockingStub = blockingStub.withInterceptors(CLIENT_INTERCEPTOR);
  }

  /**
   * Method represents gRPC method GetPlaceholders from <b>placeholder.proto</b> file
   *
   * @param placeholderRequest {@link tv.pluto.grpc.placeholder.PlaceholderRequest} POJO object
   * @return GetPlaceholdersResponse object
   */
  public Placeholder.GetPlaceholderSetsResponse getPlaceholders(
      PlaceholderRequest placeholderRequest) {
    logger.info("Getting placeholder for placeholderRequest : " + placeholderRequest);

    Placeholder.GetPlaceholdersRequest request =
        Placeholder.GetPlaceholdersRequest.newBuilder()
            .setReturnFillerClips(placeholderRequest.isReturnFillerClips())
            .setReturnErrorClip(placeholderRequest.isReturnErrorClip())
            //                .setReturnBumperClips(placeholderRequest.isReturnBumperClips())
            //                .setBumperDuration(placeholderRequest.getBumperDuration())
            .setChannelID(placeholderRequest.getChannelId())
            .setTimelineID(placeholderRequest.getTimelineId())
            .setEpisodeID(placeholderRequest.getEpisodeId())
            .setDeviceModel(placeholderRequest.getDeviceModel())
            .setDeviceType(placeholderRequest.getDeviceType())
            .setDeviceMake(placeholderRequest.getDeviceMake())
            .setMarketingRegion(placeholderRequest.getMarketingRegion())
            .build();

    return blockingStub.getPlaceholderSets(request);
  }

  /**
   * Method represents gRPC method GetComplexBumperSets from <b>placeholder.proto</b> file
   *
   * @return GetComplexBumperSetsResponse object
   */
  public Placeholder.GetComplexBumperSetsResponse getComplexBumperSetsResponse() {
    logger.info("Getting placeholder for getComplexBumperSetsResponse");

    Placeholder.GetComplexBumperRequest request =
        Placeholder.GetComplexBumperRequest.newBuilder().build();

    return blockingStub.getComplexBumperSets(request);
  }

  /**
   * Method represents gRPC method GetBumperSets from <b>placeholder.proto</b> file
   *
   * @param duration the duration of the bumper in seconds
   * @param tags a list of tags to filter the bumper sets
   * @return GetBumperSetsResponse object
   */
  public Placeholder.GetBumperSetsResponse getBumperSets(Integer duration, List<String> tags) {
    logger.info("Getting placeholder for GetBumperSets");

    Placeholder.GetBumperRequest.Builder builder = Placeholder.GetBumperRequest.newBuilder();

    if (duration != null) {
      builder.setDuration(duration);
    }
    if (!tags.isEmpty()) {
      builder.addAllTags(tags);
    }

    Placeholder.GetBumperRequest request = builder.build();

    return blockingStub.getBumperSets(request);
  }
}
