package tv.pluto;

import io.qameta.allure.Description;
import io.qameta.allure.TmsLink;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import tv.pluto.core.BaseTest;
import tv.pluto.grpc.gracenotemetadata.GracenoteMetadataClient;
import tv.pluto.mongo.entities.gracenotemetadata.GracenoteMetadata;
import tv.pluto.mongo.utils.GracenoteMetadataUtils;
import tv.pluto.utils.CommonUtils;

public class GracenoteMetadataTestSuite extends BaseTest {
  private GracenoteMetadataUtils gracenoteMetadataUtils;
  private GracenoteMetadataClient gracenoteMetadataClient;

  @BeforeClass(alwaysRun = true)
  private void setUp() {
    gracenoteMetadataUtils = new GracenoteMetadataUtils();
    gracenoteMetadataClient = new GracenoteMetadataClient(grpcChannelManager.getChannel());
  }

  @Test
  @Description("CFeedsSyncAllIds - stream returns CFEEDS stream of GracenoteMetadata ids")
  @TmsLink("28501801")
  public void C28501801_TEST() {
    Iterator<?> gracenoteIterator =
        gracenoteMetadataClient.getCFeedsResponse(null, null, null, "cFeedsSyncAllIds");
    List<String> grpcIds = new ArrayList<>();
    for (int i = 0; i < 50; i++) {
      String id =
          ((tv.pluto.ip.dal.gracenotemetadata.GracenoteMetadataOuterClass.Id)
                  gracenoteIterator.next())
              .getId();
      grpcIds.add(id);
    }

    List<?> mongoIds = gracenoteMetadataUtils.getDocumentsByIds(grpcIds);
    Assert.assertTrue(grpcIds.size() > 0);
    Assert.assertEquals(grpcIds.size(), mongoIds.size());
  }

  @Test
  @Description("cFeedsSyncDocuments - last_run_at")
  @TmsLink("28501802")
  public void C28501802_TEST() {
    LocalDateTime ranAt = LocalDateTime.now(ZoneOffset.UTC).minusMonths(3);
    Iterator<?> cFeedsSyncAllIds =
        gracenoteMetadataClient.getCFeedsResponse(null, ranAt + "Z", null, "cFeedsSyncDocuments");
    Assert.assertTrue(cFeedsSyncAllIds.hasNext());
    int i = 0;

    while (i < 100 && cFeedsSyncAllIds.hasNext()) {
      GracenoteMetadata grpcTimeline =
          gracenoteMetadataUtils.mapGrpcObjectToPojo(
              cFeedsSyncAllIds.next(), GracenoteMetadata.class);
      LocalDateTime mongoTime = grpcTimeline.getCreatedAt();
      boolean isTrue = ranAt.isBefore(mongoTime) || ranAt.equals(mongoTime);
      Assert.assertTrue(isTrue);
      System.out.println(i);
      i++;
    }
  }

  @Test(
      expectedExceptions = RuntimeException.class,
      expectedExceptionsMessageRegExp = NOT_FOUND_MESSAGE)
  @Description("cFeedsSyncDocuments - last_run_at future time")
  @TmsLink("28501803")
  public void C28501803_TEST() {
    String futureTime = CommonUtils.localDateTimeStringPlusDays(2);
    gracenoteMetadataClient.getCFeedsResponse(null, futureTime, null, "cFeedsSyncDocuments").next();
  }
}
