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

import io.grpc.StatusRuntimeException;
import io.qameta.allure.Description;
import io.qameta.allure.TmsLink;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import tv.pluto.core.BaseTest;
import tv.pluto.grpc.comscore.ComScoreClient;
import tv.pluto.mongo.entities.comscore.ComScore;
import tv.pluto.mongo.utils.ComScoreUtils;
import tv.pluto.mongo.utils.MongoUtils;

public class ComScoreTestSuite extends BaseTest {
  private ComScoreClient comscoreClient;
  private ComScoreUtils comScoreUtils;

  @BeforeClass(alwaysRun = true)
  private void setUp() {
    comScoreUtils = new ComScoreUtils();

    // Create a ChannelsClient using the in-process channel;
    comscoreClient = new ComScoreClient(grpcChannelManager.getChannel());
  }

  @Test
  @Description("Valid request - GetComScoreForClip")
  @TmsLink("28500720")
  public void C28500720_TEST() {
    String clipIdWithComScore = comScoreUtils.getIdOfClipWithComScore();

    ComScore mongoComScore = comScoreUtils.getComScoreForClip(clipIdWithComScore, "");
    ComScore mappedComScore =
        comScoreUtils.mapGrpcObjectToPojo(
            comscoreClient.getComScoreForClip(clipIdWithComScore, "").getComScore(),
            ComScore.class);

    Assert.assertEquals(mongoComScore, mappedComScore);
  }

  @Test(
      expectedExceptions = StatusRuntimeException.class,
      expectedExceptionsMessageRegExp =
          "NOT_FOUND: Comscore data for requested clip ID not found or incomplete.")
  @Description("Invalid request - GetComScoreForClip")
  @TmsLink("28500721")
  public void C28500721_TEST() {
    comscoreClient.getComScoreForClip(MongoUtils.INVALID_ID_VALUE, "");
  }

  @Test
  @Description("Valid request with single clip - GetComScoreForClips")
  @TmsLink("28500722")
  public void C28500722_TEST() {
    List<String> randomClipsIds =
        Collections.singletonList(comScoreUtils.getIdOfClipWithComScore());

    Map<String, ComScore> mongoComScoreMap = comScoreUtils.getComScoreForClips(randomClipsIds, "");
    Map<String, ?> mappedComScoreMap =
        comScoreUtils.mapMapToPojo(
            comscoreClient.getComScoreForClips(randomClipsIds).getClipsComsScoreMap(),
            ComScore.class);

    Assert.assertEquals(mongoComScoreMap, mappedComScoreMap);
  }

  @Test
  @Description("Valid request with multiple clips - GetComScoreForClips")
  @TmsLink("28500723")
  public void C28500723_TEST() {
    List<String> randomClipsIds = comScoreUtils.getIdsOfClipWithComScore();

    Map<String, ComScore> mongoComScoreMap = comScoreUtils.getComScoreForClips(randomClipsIds, "");
    Map<String, ?> mappedComScoreMap =
        comScoreUtils.mapMapToPojo(
            comscoreClient.getComScoreForClips(randomClipsIds).getClipsComsScoreMap(),
            ComScore.class);

    Assert.assertEquals(mongoComScoreMap, mappedComScoreMap);
  }

  @Test(
      expectedExceptions = StatusRuntimeException.class,
      expectedExceptionsMessageRegExp =
          "NOT_FOUND: Comscore data for requested clip IDs not found or incomplete.")
  @Description("Invalid request with single clip - GetComScoreForClips")
  @TmsLink("28500724")
  public void C28500724_TEST() {
    List<String> randomClipsIds = Collections.singletonList(MongoUtils.INVALID_ID_VALUE);
    comscoreClient.getComScoreForClips(randomClipsIds);
  }

  @Test
  @Description("Valid request with invalid clip - GetComScoreForClips")
  @TmsLink("28500725")
  public void C28500725_TEST() {
    List<String> randomClipsIds = comScoreUtils.getIdsOfClipWithComScore();
    randomClipsIds.add(MongoUtils.INVALID_ID_VALUE);

    Map<String, ComScore> mongoComScoreMap = comScoreUtils.getComScoreForClips(randomClipsIds, "");
    Map<String, ?> mappedComScoreMap =
        comScoreUtils.mapMapToPojo(
            comscoreClient.getComScoreForClips(randomClipsIds).getClipsComsScoreMap(),
            ComScore.class);

    Assert.assertEquals(mongoComScoreMap, mappedComScoreMap);
  }

  @Test(
      expectedExceptions = StatusRuntimeException.class,
      expectedExceptionsMessageRegExp =
          "NOT_FOUND: Comscore data for requested clip ID not found or incomplete.")
  @Description("Invalid request: clip without partner - GetComScoreForClip")
  @TmsLink("28500726")
  public void C28500726_TEST() {
    String clipIdWithoutPartner = comScoreUtils.getIdOfClipWithoutPartner();
    comscoreClient.getComScoreForClip(clipIdWithoutPartner, "");
  }

  @Test()
  @Description(
      "Valid request: clip with partner, but partner doesn't have comScore - GetComScoreForClip: empty playbackType")
  @TmsLink("28500727")
  public void C28500727_TEST() {
    String clipIdWithoutComScore = comScoreUtils.getIdOfClipWithoutComScore();

    ComScore mongoComScore = comScoreUtils.getComScoreForClip(clipIdWithoutComScore, "");
    ComScore mappedComScore =
        comScoreUtils.mapGrpcObjectToPojo(
            comscoreClient.getComScoreForClip(clipIdWithoutComScore, "").getComScore(),
            ComScore.class);

    Assert.assertEquals(mongoComScore, mappedComScore);
  }

  @Test()
  @Description(
      "Valid request: clip with partner, but partner doesn't have comScore - GetComScoreForClip: playbackType=vod")
  @TmsLink("28500728")
  public void C28500728_TEST() {
    String clipIdWithoutComScore = comScoreUtils.getIdOfClipWithoutComScore();

    ComScore mongoComScore = comScoreUtils.getComScoreForClip(clipIdWithoutComScore, "vod");
    ComScore mappedComScore =
        comScoreUtils.mapGrpcObjectToPojo(
            comscoreClient.getComScoreForClip(clipIdWithoutComScore, "vod").getComScore(),
            ComScore.class);

    Assert.assertEquals(mongoComScore, mappedComScore);
  }

  @Test()
  @Description(
      "Valid request: clip with partner, but partner doesn't have comScore - GetComScoreForClip: playbackType=linear")
  @TmsLink("28500729")
  public void C28500729_TEST() {
    String clipIdWithoutComScore = comScoreUtils.getIdOfClipWithoutComScore();

    ComScore mongoComScore = comScoreUtils.getComScoreForClip(clipIdWithoutComScore, "linear");
    ComScore mappedComScore =
        comScoreUtils.mapGrpcObjectToPojo(
            comscoreClient.getComScoreForClip(clipIdWithoutComScore, "linear").getComScore(),
            ComScore.class);

    Assert.assertEquals(mongoComScore, mappedComScore);
  }
}
