package io.delphiplatform.api.v3.rdb.service.ads;

import com.google.common.collect.ImmutableSet;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import io.delphiplatform.api.util.CollectionUtils;

import static io.delphiplatform.api.v3.rdb.service.ads.AdsReportType.AGE;
import static io.delphiplatform.api.v3.rdb.service.ads.AdsReportType.BASE;
import static io.delphiplatform.api.v3.rdb.service.ads.AdsReportType.COUNTRY;
import static io.delphiplatform.api.v3.rdb.service.ads.AdsReportType.GENDER;
import static io.delphiplatform.api.v3.rdb.service.ads.AdsReportType.LINKFIRE;
import static io.delphiplatform.api.v3.rdb.service.ads.AdsReportType.PLATFORM;

public enum AdsMetricEnum {

    AVERAGE_FREQUENCY(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    CLICKS(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    COMMENTS(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    CONVERSIONS(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    CONVERSION_RATE(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    CPM_IMPRESSIONS(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    CPM_REACH(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    CP_CLICK(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    CP_COMMENT(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    CP_CONVERSION(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    CP_CUSTOM_CONVERSION(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    CP_ENGAGEMENT(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    CP_LANDING_PAGE_VIEW(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    CP_LEAD(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    CP_REACTION(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    CP_THRUPLAY(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    CP_UNIQUE_CLICK(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    CP_UNIQUE_CONVERSIONS(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    CP_UNIQUE_CUSTOM_CONVERSION(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    CP_UNIQUE_OUTBOUND_CLICK(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    CP_VIDEO_VIEW(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    CTR(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    CUSTOM_CONVERSIONS(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    ENGAGEMENTS(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    IMPRESSIONS(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    LANDING_PAGE_VIEWS(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    LEADS(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    PAGE_LIKES(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    REACH(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    REACTIONS(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    SPEND(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    THRUPLAYS(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    UNIQUE_CLICKS(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    UNIQUE_CONVERSIONS(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    UNIQUE_CTR(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    UNIQUE_CUSTOM_CONV(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    UNIQUE_OUTBOUND_CLICKS(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    UNIQUE_OUTBOUND_CTR(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    VIDEO_VIEWS(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    VIDEO_WATCHED_BASE(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    VIDEO_WATCHED100(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    VIDEO_WATCHED25(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    VIDEO_WATCHED50(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    VIDEO_WATCHED75(BASE, PLATFORM, COUNTRY, AGE, GENDER),

    LF_BOUNCE_RATE(LINKFIRE, BASE, COUNTRY, PLATFORM),
    LF_CLICKS(LINKFIRE, BASE, COUNTRY, PLATFORM),
    LF_CONVERSIONS(LINKFIRE, BASE, COUNTRY, PLATFORM),
    LF_CTR(LINKFIRE, BASE, COUNTRY, PLATFORM),
    LF_DIRECT_TO_SERVICE(LINKFIRE, BASE, COUNTRY, PLATFORM),
    LF_EVENT_RATE(LINKFIRE, BASE, COUNTRY, PLATFORM),
    LF_EVENTS(LINKFIRE, BASE, COUNTRY, PLATFORM),
    LF_IN_PAGE_PLAYS(LINKFIRE, BASE, COUNTRY, PLATFORM),
    LF_NEW_SESSIONS(LINKFIRE, BASE, COUNTRY, PLATFORM),
    LF_PAGE_VIEWS(LINKFIRE, BASE, COUNTRY, PLATFORM),
    LF_PLATFORM_TO_LINKFIRE_BOUNCE_RATE(BASE, PLATFORM, COUNTRY),
    LF_PLATFORM_TO_LINKFIRE_CLICK_RATE(BASE, PLATFORM, COUNTRY),
    LF_PLATFORM_TO_LINKFIRE_EVENT_RATE(BASE, PLATFORM, COUNTRY),

    MC_SPEND(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    MC_CPM_IMPRESSIONS(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    MC_CPM_REACH(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    MC_CP_CLICK(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    MC_CP_COMMENT(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    MC_CP_CONVERSION(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    MC_CP_CUSTOM_CONVERSION(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    MC_CP_ENGAGEMENT(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    MC_CP_LANDING_PAGE_VIEW(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    MC_CP_LEAD(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    MC_CP_REACTION(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    MC_CP_THRUPLAY(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    MC_CP_UNIQUE_CLICK(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    MC_CP_UNIQUE_OUTBOUND_CLICK(BASE, PLATFORM, COUNTRY, AGE, GENDER),
    MC_CP_VIDEO_VIEW(BASE, PLATFORM, COUNTRY, AGE, GENDER),

    TT_VIDEO_PLAY_ACTIONS(BASE),
    TT_COMMENTS(BASE),
    TT_SHARES(BASE),
    TT_VIDEO_WATCHED_2_S(BASE),
    TT_FOLLOWS(BASE),
    TT_VIDEO_WATCHED_6_S(BASE),
    TT_LIKES(BASE),
    VIDEO_THROUGH_RATE(BASE, AGE, GENDER, COUNTRY, PLATFORM),
    VIDEO_COMPLETION_RATE(BASE, AGE, GENDER, COUNTRY, PLATFORM);

    private final ImmutableSet<AdsReportType> types;

    AdsMetricEnum(AdsReportType... types) {
        this.types = ImmutableSet.copyOf(types);
    }

    public String getAlias() {
        return name();
    }

    public static List<AdsMetricEnum> getMetrics(AdsReportType reportType) {
        return Arrays.stream(AdsMetricEnum.values())
            .filter(m -> CollectionUtils.contains(m.types, reportType))
            .collect(Collectors.toList());
    }
}
