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

import io.delphi.qa.auto.awsmfrw.common_baby.IsaCommonMethods;
import io.delphi.qa.auto.awsmfrw.common_baby.delphi.java.EnDelphiApiInvalidPathParamItems;
import io.delphi.qa.auto.awsmfrw.managers.helpers.api.rest.AbstractRestAssuredClient;
import io.delphi.qa.auto.awsmfrw.managers.helpers.common.IsaAssertions;
import io.delphi.qa.auto.awsmfrw.models.api.rest.v3.PlError;
import io.delphi.qa.auto.awsmfrw.models.api.rest.v3.health.PlHealth;
import io.delphi.qa.auto.awsmfrw.suppliers.DelphiDataContainer;
import io.delphi.qa.auto.awsmfrw.tests.BsTestCase;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;

import java.lang.reflect.Method;

public abstract class BsApiTest extends BsTestCase implements IsaAssertions {

  static {
    System.setProperty("delphi.slz.db.pg.isAutomation", "false");
  }

  protected <T> T restResponseOk_andAsModel(
      String methodName, Object[] dataProviderParams, Class<T> aClass) {
    AbstractRestAssuredClient.CustomRequestSpec rqSpec =
        buildRestRequestSpec(methodName, dataProviderParams);
    bsRestAssured.set(delphi.api().rest().javaApi().withRequestSpecification(rqSpec));
    return bsRestAssured
        .get()
        .call()
        .withThen()
        .withRestDesc()
        .withRsLog()
        .assertStatusCode()
        .assertSlaRsTime(LNG_SLA_RS_TIME)
        .withExtract()
        .as(aClass, IsaCommonMethods.buildGsonMapper(true));
  }

  protected PlError restResponseKo_andAsModel(String methodName, Object[] dataProviderParams) {
    AbstractRestAssuredClient.CustomRequestSpec rqSpec =
        buildRestRequestSpec(methodName, dataProviderParams);
    bsRestAssured.set(delphi.api().rest().javaApi().withRequestSpecification(rqSpec));
    return bsRestAssured
        .get()
        .call()
        .withThen()
        .withRestDesc()
        .withRsLog()
        .assertStatusCode()
        .assertSlaRsTime(LNG_SLA_RS_TIME)
        .withExtract()
        .as(PlError.class, IsaCommonMethods.buildGsonMapper(true));
  }

  protected void restResponseOk_andNFR(String methodName, Object[] dataProviderParams) {
    AbstractRestAssuredClient.CustomRequestSpec rqSpec =
        buildRestRequestSpec(methodName, dataProviderParams);
    bsRestAssured.set(delphi.api().rest().javaApi().withRequestSpecification(rqSpec));
    bsRestAssured
        .get()
        .call()
        .withThen()
        .withRestDesc()
        .withRsLog()
        .assertStatusCode()
        .assertSlaRsTime(LNG_SLA_RS_TIME);
  }

  protected void restResponseOk(String methodName, Object[] dataProviderParams) {
    AbstractRestAssuredClient.CustomRequestSpec rqSpec =
        buildRestRequestSpec(methodName, dataProviderParams);
    bsRestAssured.set(delphi.api().rest().javaApi().withRequestSpecification(rqSpec));
    bsRestAssured.get().call().withThen().withRestDesc().withRsLog().assertStatusCode();
  }

  protected static final Boolean TRUE = true;
  protected static final Boolean FALSE = false;
  // sort_order
  private static final String DESC = "desc";
  private static final String ASC = "asc";
  // pagination
  private static final int LIMIT = 10;
  private static final int LIMIT1 = 1;
  private static final int LIMIT5 = 5;
  protected static final int LIMIT20 = 20;
  private static final int LIMIT50 = 50;
  private static final int LIMIT5000 = 5000;
  private static final int OFFSET = 0;
  protected static final int OFFSET1 = 1;
  protected final int DAYS = (envConfig.delphiApiStartDateShift() - envConfig.delphiApiEndDateShift())/2;
  private final String LIMIT_RANGE = String.format("days:%s", DAYS);
  protected final String CURSOR =
      String.format(
          "date:%s", IsaCommonMethods.getDateMinusDays(envConfig.delphiApiStartDateShift() - DAYS));
  protected final String CURSOR_END_DATE =
      String.format(
          "date:%s",
          IsaCommonMethods.getDateMinusDays(
              envConfig.delphiApiEndDateShift()
                  + (envConfig.delphiApiStartDateShift() + envConfig.delphiApiEndDateShift()) % 2));
  protected final String CURSOR_NULL =
      String.format(
          "date:%s", IsaCommonMethods.getDateMinusDays(envConfig.delphiApiEndDateShift()));
  // invalid path params
  private final String DOT = EnDelphiApiInvalidPathParamItems.DOT.get();
  private final String GRAS = EnDelphiApiInvalidPathParamItems.GRAS.get();
  private final String STR = EnDelphiApiInvalidPathParamItems.STR.get();
  private final String NUM = EnDelphiApiInvalidPathParamItems.NUM.get();
  protected final String ZERO = EnDelphiApiInvalidPathParamItems.ZERO.get();
  protected final String INT_NEGATIVE = EnDelphiApiInvalidPathParamItems.INT_NEGATIVE.get();
  private final String SQL = EnDelphiApiInvalidPathParamItems.SQL.get();
  private final String SIGN = EnDelphiApiInvalidPathParamItems.SIGN.get();
  private final String SLASH = EnDelphiApiInvalidPathParamItems.SLASH.get();
  private final String EMPTY = EnDelphiApiInvalidPathParamItems.EMPTY.get();
  private final String INVALID_DATE = "2021-09-1";
  private final String INVALID_ADS_DSP = "spotify";
  protected final String SPOTIFY = "spotify";
  private final String LINKFIRE = "linkfire";

  protected static final Long LNG_SLA_RS_TIME = 2000L;

  @BeforeSuite(alwaysRun = true)
  public void defineApiEnvironment() {
    buildApiRestRequest(null, "assertSc200_pathHealth");
    PlHealth as =
        bsRestAssured
            .get()
            .call()
            .withThen()
            .withRestDesc()
            .withRsLog()
            .withExtract()
            .as(PlHealth.class, IsaCommonMethods.buildGsonMapper(true));
    DelphiDataContainer.MAP_ENV_HEALTH.put("health", as);
  }

  @BeforeMethod(alwaysRun = true)
  public void preM_executeTestMethod(Method method, Object[] dataProviderParams) {
    buildApiRestRequest(dataProviderParams, method.getName());
  }
}
