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

import io.delphi.qa.auto.awsmfrw.common_baby.IsaCommonMethods;
import io.delphi.qa.auto.awsmfrw.common_baby.IsaLogging;
import io.delphi.qa.auto.awsmfrw.common_baby.delphi.aws.EnAwsS3Buckets;
import io.delphi.qa.auto.awsmfrw.common_baby.delphi.aws.EnAwsS3DspConfigs;
import io.delphi.qa.auto.awsmfrw.common_baby.delphi.aws.EnAwsSecrets;
import io.delphi.qa.auto.awsmfrw.models.MlFw_ReportWrapper;
import io.delphi.qa.auto.awsmfrw.models.aws.cw.OptionalConfig;
import io.delphi.qa.auto.awsmfrw.models.aws.lm.WpSlzUnitOfWork;
import io.delphi.qa.auto.awsmfrw.models.db.sql.pg.MAIN.PUBLIC.MlPg_UnitOfWork;
import io.delphi.qa.auto.awsmfrw.suppliers.DelphiDataContainer;
import io.delphi.qa.auto.awsmfrw.tests.slz.BsSlzTest;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Optional;
import org.testng.annotations.Parameters;

import java.util.Set;

public abstract class BsSlzJobTest extends BsSlzTest {

  protected MlFw_ReportWrapper WP_REPORT;
  protected WpSlzUnitOfWork WP_SLZ_UNIT_OF_WORK;
  protected OptionalConfig OBJ_OPTIONAL_CONFIG = new OptionalConfig();
  protected MlPg_UnitOfWork ML_PG_UNIT_OF_WORK;

  // TODO by alexeyisakov @1/19/21#5:17 PM: Configs would not be deleted for non SUCCESS tests.
  @AfterMethod(alwaysRun = true, description = "Ensure AWS S3 buckets cleared")
  public void postC_ensureS3DspConfigsCleaned(ITestResult iTestResult) {
    if (iTestResult.getStatus() == ITestResult.SUCCESS) {
      ensureS3HasNoObjects(
          EnAwsS3Buckets.DELPHI_CONFIG.get(),
          String.format(EnAwsS3DspConfigs.BATCH_RUN_CONFIG_KEY_AUTO_PATTERN.get(), getTestRunId()));
      ensureS3HasNoObjects(
          EnAwsS3Buckets.DELPHI_CONFIG.get(),
          String.format(EnAwsS3DspConfigs.DSP_CONFIG_KEY_AUTO_PATTERN.get(), getTestRunId()));
      ensureS3HasNoObjects(
          EnAwsS3Buckets.DELPHI_CONFIG.get(),
          String.format(
              EnAwsS3DspConfigs.DSP_COMPLETE_CRITERIA_KEY_AUTO_PATTERN.get(), getTestRunId()));
    }
  }

  @BeforeMethod(
      alwaysRun = true,
      description = "Ensure AWS S3 configs uploaded",
      dependsOnMethods = {"preM_ensureS3DataBucketsCleaned"})
  public void preM_ensureS3DspConfigsUploaded() {
    // delete mock dsp source file
    super.ensureS3HasNoObjects(
        EnAwsS3Buckets.DELPHI_AUTOTESTS.get(),
        IsaCommonMethods.buildS3BucketPrefix(WP_SLZ_UNIT_OF_WORK));
    // upload dsp source mock file to s3 %s-delphi-autotest
    if (envConfig.isLocalS3()) super.uploadMockDspContextFile(WP_SLZ_UNIT_OF_WORK, "1000", true);
    // upload dsp config for test run to s3
    String xDspConfigKey =
        super.uploadCustomDspConfigFile(WP_SLZ_UNIT_OF_WORK, super.getTestRunId());
    // upload batch run config for test run to s3
    String xEcsRunConfigKey = super.uploadCustomButchRunConfig(WP_SLZ_UNIT_OF_WORK);
    // upload dsp complete_criteria to s3
    String xDspCompletionConfigKey =
        super.uploadCustomCompleteCriteriaFile(WP_REPORT, super.getTestRunId());
    // fill optional config
    String xRdsSecretsKey = EnAwsSecrets.DELPHI_AUTOTESTS_CONFIG.resourceLocator();
    OBJ_OPTIONAL_CONFIG
        .withDspConfigKey(xDspConfigKey)
        .withEcsRunConfigKey(xEcsRunConfigKey)
        .withDspCompletionConfigKey(xDspCompletionConfigKey)
        .withRdsSecretsKey(xRdsSecretsKey);
  }

  @BeforeMethod(
      description = "BS: postgres has no records",
      alwaysRun = true,
      dependsOnMethods = {"preM_initUnitOfWork"})
  public void preM_ensurePostgresHasNoRecords() {
    String searchPattern = IsaCommonMethods.buildUnitOfWorkCode(WP_REPORT);
    Set<MlPg_UnitOfWork> uowSet =
        delphi
            .db()
            .postgres(secretMap)
            .awsmSelect(new MlPg_UnitOfWork(), "unit_of_work_code ~ '" + searchPattern + "'");
    this
        .ensureRecordsNotInTables_ContentFailureLog_DisassembleContentStatus_ContentStatus_UnitOfWork(
            uowSet);
  }

  @BeforeMethod(
      alwaysRun = true,
      description = "Ensure AWS S3 data buckets cleaned",
      dependsOnMethods = {"preM_ensurePostgresHasNoRecords"})
  public void preM_ensureS3DataBucketsCleaned() {
    // clear s3 report archive bucket
    ensureS3HasNoObjects(
        EnAwsS3Buckets.DELPHI_SME_DATA_ARCHIVE.get(),
        IsaCommonMethods.buildS3ReportPrefix(WP_SLZ_UNIT_OF_WORK));
    // clear s3 report decompressed bucket
    ensureS3HasNoObjects(
        EnAwsS3Buckets.DELPHI_SME_DATA_DECOMPRESED.get(),
        IsaCommonMethods.buildS3ReportPrefix(WP_SLZ_UNIT_OF_WORK));
  }

  @BeforeMethod(
      description = "Start TC logging",
      alwaysRun = true,
      dependsOnMethods = {"preM_startTestCaseLog"})
  @Parameters({"reportNameText"})
  public void preM_initUnitOfWork(
//                  @Optional("apple-sme-amShazam-v1_2") String reportNameText) {
      //      @Optional("apple-sme-amSongs-v1_0") String reportNameText) {
      //            @Optional("apple-sme-amEvent-v1_2") String reportNameText) {
                @Optional("apple-theorchard-amShazam-v1_2") String reportNameText) {
//      @Optional("apple-sme+theorchard-amLibraryEvents-v1_0") String reportNameText) {
//    @Optional("apollo-sme-spotify_playlist_track_position-v1") String reportNameText) {
//          @Optional("amazonadsupported-sme-playlist-v1") String reportNameText) {
//    @Optional("apple-theorchard-amPlaylists-v1_0") String reportNameText) {
    //          @Optional("amazonadsupported-theorchard-activity-v1") String reportNameText) {
    //      @Optional("amazonadsupported-theorchard-user-v1") String reportNameText) {
    //      @Optional("amazonadsupported-theorchard-playlist-v1") String reportNameText) {
    //      @Optional("amazonadsupported-sme-user-v1") String reportNameText) {
    //                @Optional("amazonadsupported-sme-activity-v1") String reportNameText) {
    //              @Optional("spotify-sme-sub_30_sec_streams-v4") String reportNameText) {
    //          @Optional("spotify-sme-users-v4") String reportNameText) {
    //      @Optional("spotify-sme-streams-v4") String reportNameText) {
    //          @Optional("spotify-theorchard-streams-v4") String reportNameText) {
    //          @Optional("spotify-theorchard-streams-v4") String reportNameText) {
    //          @Optional("spotify-theorchard-streams-v4") String reportNameText) {
    //          @Optional("spotify-theorchardintl-streams-v4") String reportNameText) {
    //          @Optional("spotify-smecharity-streams-v4") String reportNameText) {
    //          @Optional("spotify-theorchard-streams-v4") String reportNameText) {
    //          @Optional("spotify-sme-sub_30_sec_streams-v4") String reportNameText) {
    //          @Optional("spotify-theorchard-sub_30_sec_streams-v4") String reportNameText) {
    //          @Optional("spotify-theorchardintl-sub_30_sec_streams-v4") String reportNameText) {
    //          @Optional("spotify-smecharity-sub_30_sec_streams-v4") String reportNameText) {
    //          @Optional("spotify-theorchard-sub_30_sec_streams-v4") String reportNameText) {
//                  @Optional("spotify-theorchard-aggregatedstreams-v2") String reportNameText) {
    //      @Optional("linkfire-sme-linkfire_raw_data-v1_0") String reportNameText) {
    WP_REPORT = IsaCommonMethods.buildWpReport(reportNameText);
    WP_SLZ_UNIT_OF_WORK = DelphiDataContainer.genNewMlWpUnitOfWork(WP_REPORT);
    WP_SLZ_UNIT_OF_WORK
        //        .withRequiredContextAmount(calcRequiredContextAmount(WP_SLZ_UNIT_OF_WORK))
        .withCompleteCriteriaSet(
        getCustomCompleteCriteriaItem(WP_REPORT, envConfig.whichCompleteCriteria()));
    IsaLogging.log(
        this.getClass(),
        "\nStart TC logging:\n\t- uow under test:\n" + gson.toJson(WP_SLZ_UNIT_OF_WORK));
  }
}
