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

import io.delphi.qa.auto.awsmfrw.common_baby.IsaConstants;
import io.delphi.qa.auto.awsmfrw.models.api.rest.v3.ads.performance.EnAdsPerformanceGroupBys;
import io.delphi.qa.auto.awsmfrw.models.api.rest.v3.ads.performance.EnAdsPerformanceSortBys;
import io.delphi.qa.auto.awsmfrw.models.api.rest.v3.methods.ICanFetchAdsPerformanceData;
import io.delphi.qa.auto.awsmfrw.models.ui.decibel.MlAdsPerformance;

import java.util.Set;

public abstract class BsAdsDataTest extends BsApiRestMagicTest
    implements ICanFetchAdsPerformanceData {

  protected final String GROUP_BY_AD_SET = "ad_set";
  protected final String GROUP_BY_AGE_BAND = "age_band";
  protected final String GROUP_BY_ARTIST = "artist";
  protected final String GROUP_BY_PROJECT = "project";
  protected final String GROUP_BY_CAMPAIGN = "campaign";
  protected final String GROUP_BY_PHASE = "phase";
  protected final String GROUP_BY_GENDER = "gender";
  protected final String GROUP_BY_PLATFORM = "platform";
  protected final String GROUP_BY_PROVIDER = "provider";
  protected final String GROUP_BY_CATEGORY = "category";
  protected final String GROUP_BY_SUB_CATEGORY = "sub_category";
  protected final String GROUP_BY_OBJECTIVE = "objective";
  protected final String GROUP_BY_DATE = "date";
  protected final String GROUP_BY_WEEK = "week";
  protected final String GROUP_BY_CHARTWEEK = "chartweek";
  protected final String GROUP_BY_MONTH = "month";
  protected final String GROUP_BYS = "link_url,referrer_name";
  protected final String GROUP_BY_LINK_TYPE = "link_type";
  protected final String GROUP_BY_LINK_URL = "link_url";
  protected final String GROUP_BY_REFERRER_NAME = "referrer_name";
  protected final String GROUP_BY_REFERRER_DOMAIN = "referrer_domain";
  protected final String GROUP_BY_REGION = "region";
  protected final String PROVIDER_ID = IsaConstants.fetchDefaultProviderId();
  protected final String USER_ID = IsaConstants.fetchDefaultUserId();
  protected final String DECIBEL_LABEL_ID = IsaConstants.fetchDefaultDecibelLabelId();
  private final String PROVIDER_IDS = String.join(",", fetchProviderIds());
  private final String DECIBEL_LABEL_IDS = String.join(",", fetchDecibelLabelId());
  private final String REFERRER_DOMAIN = fetchReferrerDomain();
  private final String REFERRER_DOMAINS = String.join(",", fetchReferrerDomains());
  private final String DSP = fetchAdsDsp();
  private final String DSPS = String.join(",", fetchAdsDsps());
  protected final String PLATFORM = fetchPlatform(true);
  private final String PLATFORMS = String.join(",", fetchPlatforms(true));
  private final String SUB_CATEGORY_ID = fetchSubCategoryId();
  private final String SUB_CATEGORY_IDS = String.join(",", fetchSubCategoryIds());
  private final String LINKFIRE = "linkfire";
  private final String OTHER = fetchGroupBy(EnAdsPerformanceGroupBys.asSet());
  private final String METRICS_FINANCE =
      fetchSortBys(EnAdsPerformanceSortBys.values(), "METRICS_FINANCE").get();
  private final String METRICS_GENERAL =
      fetchSortBys(EnAdsPerformanceSortBys.values(), "METRICS_GENERAL").get();
  private final String METRICS_VIDEO =
      fetchSortBys(EnAdsPerformanceSortBys.values(), "METRICS_VIDEO").get();
  private final String SORT_BY_METRICS_FINANCE =
      fetchSortBys(EnAdsPerformanceSortBys.values(), "METRICS_FINANCE").get();
  private final String SORT_BY_METRICS_GENERAL =
      fetchSortBys(EnAdsPerformanceSortBys.values(), "METRICS_GENERAL").get();
  private final String SORT_BY_METRICS_VIDEO =
      fetchSortBys(EnAdsPerformanceSortBys.values(), "METRICS_VIDEO").get();
  private final String SORT_BY_METRICS_LINKFIRE =
      fetchSortBys(EnAdsPerformanceSortBys.values(), "METRICS_VIDEO").get();
  private final String DIMENSIONS_PHASE_NAME = EnAdsPerformanceSortBys.DIMENSIONS_PHASE_NAME.get();
  private final String DIMENSIONS_PROJECT_PROJECT_NAME =
      EnAdsPerformanceSortBys.DIMENSIONS_PROJECT_PROJECT_NAME.get();
  private final String DIMENSIONS_ARTIST_FULL_NAME =
      EnAdsPerformanceSortBys.DIMENSIONS_ARTIST_FULL_NAME.get();
  private final String DIMENSIONS_CAMPAIGN_CAMPAIGN_NAME =
      EnAdsPerformanceSortBys.DIMENSIONS_CAMPAIGN_CAMPAIGN_NAME.get();

  protected MlAdsPerformance mlAdsPerformance =
      new MlAdsPerformance()
          .withUser(USER_ID)
          .withDecibelLabel(DECIBEL_LABEL_ID)
          .withPlatform(PLATFORM)
          .withProvider(PROVIDER_ID)
          .withStartDate(START_DATE)
          .withEndDate(END_DATE);
  Set<String> CAMPAIGN_ID_ITEMS =
      fetchCampaignIds(mlAdsPerformance.withIsAssigned(true).withIsPending(null));
  {
    CAMPAIGN_ID_ITEMS =
        CAMPAIGN_ID_ITEMS.iterator().hasNext() ? CAMPAIGN_ID_ITEMS : fetchCampaignIds();
  }
  String CAMPAIGN_IDS = String.join(",", CAMPAIGN_ID_ITEMS);
  String CAMPAIGN_ID = randomItem(CAMPAIGN_ID_ITEMS);
  // select artist_ids
  Set<String> ARTIST_ID_ITEMS =
      fetchArtistIds(mlAdsPerformance.withIsAssigned(true).withIsPending(null));
  {
    ARTIST_ID_ITEMS =
        ARTIST_ID_ITEMS.iterator().hasNext() ? ARTIST_ID_ITEMS: fetchArtistIds();
  }

  String ARTIST_IDS = String.join(",", ARTIST_ID_ITEMS);
  String ARTIST_ID = randomItem(ARTIST_ID_ITEMS);
  // select project_ids
  Set<String> PROJECT_ID_ITEMS =
      fetchProjectIds(mlAdsPerformance.withIsAssigned(true).withIsPending(null));
  String PROJECT_IDS = String.join(",", PROJECT_ID_ITEMS);
  String PROJECT_ID = randomItem(PROJECT_ID_ITEMS);
  // select phase_ids
//  Set<String> PHASE_ID_ITEMS =
//      fetchPhaseIds(mlAdsPerformance.withIsAssigned(true).withIsPending(null));
//  String PHASE_IDS = String.join(",", PHASE_ID_ITEMS);
//  String PHASE_ID = randomItem(PHASE_ID_ITEMS);
}
