package io.delphi.qa.auto.awsmfrw.tests.slz.api;

import io.delphi.qa.auto.awsmfrw.common_baby.IsaCommonMethods;
import io.delphi.qa.auto.awsmfrw.common_baby.delphi.aws.EnAwsSecrets;
import io.delphi.qa.auto.awsmfrw.common_baby.delphi.aws.ICanFetchAwsSecret;
import io.delphi.qa.auto.awsmfrw.models.aws.sf.RqSlzJobManager;
import io.delphi.qa.auto.awsmfrw.suppliers.DelphiDataContainer;
import io.delphi.qa.auto.awsmfrw.tests.BsTestCase;
import io.qameta.allure.Epic;
import io.qameta.allure.Issue;
import io.qameta.allure.TmsLink;
import io.qameta.allure.TmsLinks;
import org.hamcrest.Matchers;
import org.hamcrest.core.AnyOf;
import org.testng.annotations.Optional;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

import java.io.File;
import java.util.Collections;
import java.util.List;
import java.util.Map;

@Epic("DAE-427\\[AUTO][SLZ] Automation Framework")
@TmsLinks({@TmsLink("DLP-521")})
public class Test_SlzApiDspAppleApiHealthCheck extends BsTestCase implements ICanFetchAwsSecret {

  protected final Map<String, String> MAP_SECRET_SLZ_APPLE =
      fetchAwsSecret(EnAwsSecrets.DELPHI_SLZ_APPLE);

  @Override
  public String genTestRunId() {
    return IsaCommonMethods.testRunId();
  }

  @Issue("DAE-809")
  @Test
  @Parameters({"reportNameText"})
  public void tc1_whenReportDateMinus2Days_thenStatusCodeAnyOfValid(
      @Optional("apple-theorchard-amShazam-v1_2") String reportNameText) {
    List<RqSlzJobManager> jobs = delphi.fs().listSfRqSlzMainFlow(reportNameText);
    int index = jobs.size() > 1 ? IsaCommonMethods.random.nextInt(jobs.size() - 1) : 0;
    RqSlzJobManager job = jobs.get(index);
    byte[] bytes =
        delphi
            .api()
            .rest()
            .appleApi()
            .withBody(
                String.format(
                    "jsonRequest=%s",
                    IsaCommonMethods.encodeURL(
                        IsaCommonMethods.gson.toJson(
                            DelphiDataContainer.genPlAppleApiReport(
                                MAP_SECRET_SLZ_APPLE, job, DT_NOW.minusDays(2))))))
            .execPost("reportservice/sales/v1")
            .withThen()
            .withValidatableRs()
            .statusCode(AnyOf.anyOf(Matchers.is(200), Matchers.is(210), Matchers.is(400)))
            .extract()
            .asByteArray();
    IsaCommonMethods.writeStreamToFile(
        bytes, new File("build/"), reportNameText, DT_NOW.getMillis() + "-details.txt.gz");
  }

  @Issue("DAE-809")
  @Test
  @Parameters({"reportNameText"})
  public void tc2_whenReportDateCurrentDay_thenStatusCodeAnyOfValid(
      @Optional("apple-theorchard-amShazam-v1_2") String reportNameText) {
    List<RqSlzJobManager> jobs = delphi.fs().listSfRqSlzMainFlow(reportNameText);
    int index = jobs.size() > 1 ? IsaCommonMethods.random.nextInt(jobs.size() - 1) : 0;
    RqSlzJobManager job = jobs.get(index);
    delphi
        .api()
        .rest()
        .appleApi()
        .withBodies(
            Collections.singletonList(
                String.format(
                    "jsonRequest=%s",
                    IsaCommonMethods.encodeURL(
                        IsaCommonMethods.gson.toJson(
                            DelphiDataContainer.genPlAppleApiReport(
                                MAP_SECRET_SLZ_APPLE, job, DT_NOW.minusDays(2)))))))
        .execPost("reportservice/sales/v1")
        .withThen()
        .withValidatableRs()
        .statusCode(AnyOf.anyOf(Matchers.is(200), Matchers.is(210), Matchers.is(400)));
  }

  @Issue("DAE-809")
  @Test
  @Parameters({"reportNameText"})
  public void tc3_whenReportDateNowDays_thenStatusCodeAnyOfValid(
      @Optional("apple-theorchard-amShazam-v1_2") String reportNameText) {
    List<RqSlzJobManager> jobs = delphi.fs().listSfRqSlzMainFlow(reportNameText);
    int index = jobs.size() > 1 ? IsaCommonMethods.random.nextInt(jobs.size() - 1) : 0;
    RqSlzJobManager job = jobs.get(index);
    byte[] bytes =
        delphi
            .api()
            .rest()
            .appleApi()
            .withBody(
                String.format(
                    "jsonRequest=%s",
                    IsaCommonMethods.encodeURL(
                        IsaCommonMethods.gson.toJson(
                            DelphiDataContainer.genPlAppleApiReport(
                                MAP_SECRET_SLZ_APPLE, job, DT_NOW)))))
            .execPost("reportservice/sales/v1")
            .withThen()
            .withValidatableRs()
            .statusCode(AnyOf.anyOf(Matchers.is(200), Matchers.is(210), Matchers.is(400)))
            .extract()
            .asByteArray();
    IsaCommonMethods.writeStreamToFile(
        bytes, new File("build/"), reportNameText, DT_NOW.getMillis() + "-details.txt.gz");
  }
}
