com.facebook.ads.sdk.AdReportRun.java Source code

Java tutorial

Introduction

Here is the source code for com.facebook.ads.sdk.AdReportRun.java

Source

/**
 * Copyright (c) 2015-present, Facebook, Inc. All rights reserved.
 *
 * You are hereby granted a non-exclusive, worldwide, royalty-free license to
 * use, copy, modify, and distribute this software in source code or binary
 * form for use in connection with the web services and APIs provided by
 * Facebook.
 *
 * As with any software that integrates with the Facebook platform, your use
 * of this software is subject to the Facebook Developer Principles and
 * Policies [http://developers.facebook.com/policy/]. This copyright notice
 * shall be included in all copies or substantial portions of the software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 *
 */

package com.facebook.ads.sdk;

import java.io.File;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.google.gson.JsonObject;
import com.google.gson.JsonArray;
import com.google.gson.annotations.SerializedName;
import com.google.gson.reflect.TypeToken;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;

import com.facebook.ads.sdk.APIException.MalformedResponseException;

/**
 * This class is auto-genereated.
 *
 * For any issues or feature requests related to this class, please let us know
 * on github and we'll fix in our codegen framework. We'll not be able to accept
 * pull request for this class.
 *
 */
public class AdReportRun extends APINode {
    @SerializedName("account_id")
    private String mAccountId = null;
    @SerializedName("async_percent_completion")
    private Long mAsyncPercentCompletion = null;
    @SerializedName("async_status")
    private String mAsyncStatus = null;
    @SerializedName("date_start")
    private String mDateStart = null;
    @SerializedName("date_stop")
    private String mDateStop = null;
    @SerializedName("emails")
    private List<String> mEmails = null;
    @SerializedName("friendly_name")
    private String mFriendlyName = null;
    @SerializedName("id")
    private String mId = null;
    @SerializedName("is_bookmarked")
    private Boolean mIsBookmarked = null;
    @SerializedName("is_running")
    private Boolean mIsRunning = null;
    @SerializedName("schedule_id")
    private String mScheduleId = null;
    @SerializedName("time_completed")
    private Long mTimeCompleted = null;
    @SerializedName("time_ref")
    private Long mTimeRef = null;
    protected static Gson gson = null;

    AdReportRun() {
    }

    public AdReportRun(Long id, APIContext context) {
        this(id.toString(), context);
    }

    public AdReportRun(String id, APIContext context) {
        this.mId = id;
        this.context = context;
    }

    public AdReportRun fetch() throws APIException {
        AdReportRun newInstance = fetchById(this.getPrefixedId().toString(), this.context);
        this.copyFrom(newInstance);
        return this;
    }

    public static AdReportRun fetchById(Long id, APIContext context) throws APIException {
        return fetchById(id.toString(), context);
    }

    public static AdReportRun fetchById(String id, APIContext context) throws APIException {
        AdReportRun adReportRun = new APIRequestGet(id, context).requestAllFields().execute();
        return adReportRun;
    }

    public static APINodeList<AdReportRun> fetchByIds(List<String> ids, List<String> fields, APIContext context)
            throws APIException {
        return (APINodeList<AdReportRun>) (new APIRequest<AdReportRun>(context, "", "/", "GET",
                AdReportRun.getParser()).setParam("ids", String.join(",", ids)).requestFields(fields).execute());
    }

    private String getPrefixedId() {
        return getId();
    }

    public String getId() {
        return getFieldId().toString();
    }

    public static AdReportRun loadJSON(String json, APIContext context) {
        AdReportRun adReportRun = getGson().fromJson(json, AdReportRun.class);
        if (context.isDebug()) {
            JsonParser parser = new JsonParser();
            JsonElement o1 = parser.parse(json);
            JsonElement o2 = parser.parse(adReportRun.toString());
            if (o1.getAsJsonObject().get("__fb_trace_id__") != null) {
                o2.getAsJsonObject().add("__fb_trace_id__", o1.getAsJsonObject().get("__fb_trace_id__"));
            }
            if (!o1.equals(o2)) {
                context.log("[Warning] When parsing response, object is not consistent with JSON:");
                context.log("[JSON]" + o1);
                context.log("[Object]" + o2);
            }
            ;
        }
        adReportRun.context = context;
        adReportRun.rawValue = json;
        JsonParser parser = new JsonParser();
        JsonObject o = parser.parse(json).getAsJsonObject();
        String reportRunId = null;
        if (o.has("report_run_id")) {
            reportRunId = o.get("report_run_id").getAsString();
            if (reportRunId != null) {
                adReportRun.mId = reportRunId;
            }
        }
        return adReportRun;
    }

    public static APINodeList<AdReportRun> parseResponse(String json, APIContext context, APIRequest request)
            throws MalformedResponseException {
        APINodeList<AdReportRun> adReportRuns = new APINodeList<AdReportRun>(request, json);
        JsonArray arr;
        JsonObject obj;
        JsonParser parser = new JsonParser();
        Exception exception = null;
        try {
            JsonElement result = parser.parse(json);
            if (result.isJsonArray()) {
                // First, check if it's a pure JSON Array
                arr = result.getAsJsonArray();
                for (int i = 0; i < arr.size(); i++) {
                    adReportRuns.add(loadJSON(arr.get(i).getAsJsonObject().toString(), context));
                }
                ;
                return adReportRuns;
            } else if (result.isJsonObject()) {
                obj = result.getAsJsonObject();
                if (obj.has("data")) {
                    if (obj.has("paging")) {
                        JsonObject paging = obj.get("paging").getAsJsonObject().get("cursors").getAsJsonObject();
                        String before = paging.has("before") ? paging.get("before").getAsString() : null;
                        String after = paging.has("after") ? paging.get("after").getAsString() : null;
                        adReportRuns.setPaging(before, after);
                    }
                    if (obj.get("data").isJsonArray()) {
                        // Second, check if it's a JSON array with "data"
                        arr = obj.get("data").getAsJsonArray();
                        for (int i = 0; i < arr.size(); i++) {
                            adReportRuns.add(loadJSON(arr.get(i).getAsJsonObject().toString(), context));
                        }
                        ;
                    } else if (obj.get("data").isJsonObject()) {
                        // Third, check if it's a JSON object with "data"
                        obj = obj.get("data").getAsJsonObject();
                        boolean isRedownload = false;
                        for (String s : new String[] { "campaigns", "adsets", "ads" }) {
                            if (obj.has(s)) {
                                isRedownload = true;
                                obj = obj.getAsJsonObject(s);
                                for (Map.Entry<String, JsonElement> entry : obj.entrySet()) {
                                    adReportRuns.add(loadJSON(entry.getValue().toString(), context));
                                }
                                break;
                            }
                        }
                        if (!isRedownload) {
                            adReportRuns.add(loadJSON(obj.toString(), context));
                        }
                    }
                    return adReportRuns;
                } else if (obj.has("images")) {
                    // Fourth, check if it's a map of image objects
                    obj = obj.get("images").getAsJsonObject();
                    for (Map.Entry<String, JsonElement> entry : obj.entrySet()) {
                        adReportRuns.add(loadJSON(entry.getValue().toString(), context));
                    }
                    return adReportRuns;
                } else {
                    // Fifth, check if it's an array of objects indexed by id
                    boolean isIdIndexedArray = true;
                    for (Map.Entry entry : obj.entrySet()) {
                        String key = (String) entry.getKey();
                        if (key.equals("__fb_trace_id__")) {
                            continue;
                        }
                        JsonElement value = (JsonElement) entry.getValue();
                        if (value != null && value.isJsonObject() && value.getAsJsonObject().has("id")
                                && value.getAsJsonObject().get("id") != null
                                && value.getAsJsonObject().get("id").getAsString().equals(key)) {
                            adReportRuns.add(loadJSON(value.toString(), context));
                        } else {
                            isIdIndexedArray = false;
                            break;
                        }
                    }
                    if (isIdIndexedArray) {
                        return adReportRuns;
                    }

                    // Sixth, check if it's pure JsonObject
                    adReportRuns.clear();
                    adReportRuns.add(loadJSON(json, context));
                    return adReportRuns;
                }
            }
        } catch (Exception e) {
            exception = e;
        }
        throw new MalformedResponseException("Invalid response string: " + json, exception);
    }

    @Override
    public APIContext getContext() {
        return context;
    }

    @Override
    public void setContext(APIContext context) {
        this.context = context;
    }

    @Override
    public String toString() {
        return getGson().toJson(this);
    }

    public APIRequestGetInsights getInsights() {
        return new APIRequestGetInsights(this.getPrefixedId().toString(), context);
    }

    public APIRequestGet get() {
        return new APIRequestGet(this.getPrefixedId().toString(), context);
    }

    public String getFieldAccountId() {
        return mAccountId;
    }

    public Long getFieldAsyncPercentCompletion() {
        return mAsyncPercentCompletion;
    }

    public String getFieldAsyncStatus() {
        return mAsyncStatus;
    }

    public String getFieldDateStart() {
        return mDateStart;
    }

    public String getFieldDateStop() {
        return mDateStop;
    }

    public List<String> getFieldEmails() {
        return mEmails;
    }

    public String getFieldFriendlyName() {
        return mFriendlyName;
    }

    public String getFieldId() {
        return mId;
    }

    public Boolean getFieldIsBookmarked() {
        return mIsBookmarked;
    }

    public Boolean getFieldIsRunning() {
        return mIsRunning;
    }

    public String getFieldScheduleId() {
        return mScheduleId;
    }

    public Long getFieldTimeCompleted() {
        return mTimeCompleted;
    }

    public Long getFieldTimeRef() {
        return mTimeRef;
    }

    public static class APIRequestGetInsights extends APIRequest<AdsInsights> {

        APINodeList<AdsInsights> lastResponse = null;

        @Override
        public APINodeList<AdsInsights> getLastResponse() {
            return lastResponse;
        }

        public static final String[] PARAMS = {};

        public static final String[] FIELDS = { "account_id", "account_name", "action_values", "actions", "ad_id",
                "ad_name", "adset_id", "adset_name", "age", "app_store_clicks", "buying_type",
                "call_to_action_asset", "call_to_action_clicks", "campaign_id", "campaign_name",
                "canvas_avg_view_percent", "canvas_avg_view_time", "canvas_component_avg_pct_view", "clicks",
                "cost_per_10_sec_video_view", "cost_per_action_type", "cost_per_estimated_ad_recallers",
                "cost_per_inline_link_click", "cost_per_inline_post_engagement", "cost_per_total_action",
                "cost_per_unique_action_type", "cost_per_unique_click", "cost_per_unique_inline_link_click",
                "country", "cpc", "cpm", "cpp", "ctr", "date_start", "date_stop", "deeplink_clicks",
                "device_platform", "dma", "estimated_ad_recall_rate", "estimated_ad_recallers", "frequency",
                "frequency_value", "gender", "hourly_stats_aggregated_by_advertiser_time_zone",
                "hourly_stats_aggregated_by_audience_time_zone", "impression_device", "impressions",
                "impressions_dummy", "inline_link_click_ctr", "inline_link_clicks", "inline_post_engagement",
                "newsfeed_avg_position", "newsfeed_clicks", "newsfeed_impressions", "objective", "place_page_id",
                "place_page_name", "placement", "product_id", "reach", "region", "relevance_score", "social_clicks",
                "social_impressions", "social_reach", "social_spend", "spend", "total_action_value",
                "total_actions", "total_unique_actions", "unique_actions", "unique_clicks", "unique_ctr",
                "unique_impressions", "unique_inline_link_click_ctr", "unique_inline_link_clicks",
                "unique_link_clicks_ctr", "unique_social_clicks", "unique_social_impressions",
                "video_10_sec_watched_actions", "video_15_sec_watched_actions", "video_30_sec_watched_actions",
                "video_avg_pct_watched_actions", "video_avg_percent_watched_actions",
                "video_avg_sec_watched_actions", "video_avg_time_watched_actions", "video_complete_watched_actions",
                "video_p100_watched_actions", "video_p25_watched_actions", "video_p50_watched_actions",
                "video_p75_watched_actions", "video_p95_watched_actions", "website_clicks", "website_ctr", };

        @Override
        public APINodeList<AdsInsights> parseResponse(String response) throws APIException {
            return AdsInsights.parseResponse(response, getContext(), this);
        }

        @Override
        public APINodeList<AdsInsights> execute() throws APIException {
            return execute(new HashMap<String, Object>());
        }

        @Override
        public APINodeList<AdsInsights> execute(Map<String, Object> extraParams) throws APIException {
            lastResponse = parseResponse(executeInternal(extraParams));
            return lastResponse;
        }

        public APIRequestGetInsights(String nodeId, APIContext context) {
            super(context, nodeId, "/insights", "GET", Arrays.asList(PARAMS));
        }

        @Override
        public APIRequestGetInsights setParam(String param, Object value) {
            setParamInternal(param, value);
            return this;
        }

        @Override
        public APIRequestGetInsights setParams(Map<String, Object> params) {
            setParamsInternal(params);
            return this;
        }

        public APIRequestGetInsights requestAllFields() {
            return this.requestAllFields(true);
        }

        public APIRequestGetInsights requestAllFields(boolean value) {
            for (String field : FIELDS) {
                this.requestField(field, value);
            }
            return this;
        }

        @Override
        public APIRequestGetInsights requestFields(List<String> fields) {
            return this.requestFields(fields, true);
        }

        @Override
        public APIRequestGetInsights requestFields(List<String> fields, boolean value) {
            for (String field : fields) {
                this.requestField(field, value);
            }
            return this;
        }

        @Override
        public APIRequestGetInsights requestField(String field) {
            this.requestField(field, true);
            return this;
        }

        @Override
        public APIRequestGetInsights requestField(String field, boolean value) {
            this.requestFieldInternal(field, value);
            return this;
        }

        public APIRequestGetInsights requestAccountIdField() {
            return this.requestAccountIdField(true);
        }

        public APIRequestGetInsights requestAccountIdField(boolean value) {
            this.requestField("account_id", value);
            return this;
        }

        public APIRequestGetInsights requestAccountNameField() {
            return this.requestAccountNameField(true);
        }

        public APIRequestGetInsights requestAccountNameField(boolean value) {
            this.requestField("account_name", value);
            return this;
        }

        public APIRequestGetInsights requestActionValuesField() {
            return this.requestActionValuesField(true);
        }

        public APIRequestGetInsights requestActionValuesField(boolean value) {
            this.requestField("action_values", value);
            return this;
        }

        public APIRequestGetInsights requestActionsField() {
            return this.requestActionsField(true);
        }

        public APIRequestGetInsights requestActionsField(boolean value) {
            this.requestField("actions", value);
            return this;
        }

        public APIRequestGetInsights requestAdIdField() {
            return this.requestAdIdField(true);
        }

        public APIRequestGetInsights requestAdIdField(boolean value) {
            this.requestField("ad_id", value);
            return this;
        }

        public APIRequestGetInsights requestAdNameField() {
            return this.requestAdNameField(true);
        }

        public APIRequestGetInsights requestAdNameField(boolean value) {
            this.requestField("ad_name", value);
            return this;
        }

        public APIRequestGetInsights requestAdsetIdField() {
            return this.requestAdsetIdField(true);
        }

        public APIRequestGetInsights requestAdsetIdField(boolean value) {
            this.requestField("adset_id", value);
            return this;
        }

        public APIRequestGetInsights requestAdsetNameField() {
            return this.requestAdsetNameField(true);
        }

        public APIRequestGetInsights requestAdsetNameField(boolean value) {
            this.requestField("adset_name", value);
            return this;
        }

        public APIRequestGetInsights requestAgeField() {
            return this.requestAgeField(true);
        }

        public APIRequestGetInsights requestAgeField(boolean value) {
            this.requestField("age", value);
            return this;
        }

        public APIRequestGetInsights requestAppStoreClicksField() {
            return this.requestAppStoreClicksField(true);
        }

        public APIRequestGetInsights requestAppStoreClicksField(boolean value) {
            this.requestField("app_store_clicks", value);
            return this;
        }

        public APIRequestGetInsights requestBuyingTypeField() {
            return this.requestBuyingTypeField(true);
        }

        public APIRequestGetInsights requestBuyingTypeField(boolean value) {
            this.requestField("buying_type", value);
            return this;
        }

        public APIRequestGetInsights requestCallToActionAssetField() {
            return this.requestCallToActionAssetField(true);
        }

        public APIRequestGetInsights requestCallToActionAssetField(boolean value) {
            this.requestField("call_to_action_asset", value);
            return this;
        }

        public APIRequestGetInsights requestCallToActionClicksField() {
            return this.requestCallToActionClicksField(true);
        }

        public APIRequestGetInsights requestCallToActionClicksField(boolean value) {
            this.requestField("call_to_action_clicks", value);
            return this;
        }

        public APIRequestGetInsights requestCampaignIdField() {
            return this.requestCampaignIdField(true);
        }

        public APIRequestGetInsights requestCampaignIdField(boolean value) {
            this.requestField("campaign_id", value);
            return this;
        }

        public APIRequestGetInsights requestCampaignNameField() {
            return this.requestCampaignNameField(true);
        }

        public APIRequestGetInsights requestCampaignNameField(boolean value) {
            this.requestField("campaign_name", value);
            return this;
        }

        public APIRequestGetInsights requestCanvasAvgViewPercentField() {
            return this.requestCanvasAvgViewPercentField(true);
        }

        public APIRequestGetInsights requestCanvasAvgViewPercentField(boolean value) {
            this.requestField("canvas_avg_view_percent", value);
            return this;
        }

        public APIRequestGetInsights requestCanvasAvgViewTimeField() {
            return this.requestCanvasAvgViewTimeField(true);
        }

        public APIRequestGetInsights requestCanvasAvgViewTimeField(boolean value) {
            this.requestField("canvas_avg_view_time", value);
            return this;
        }

        public APIRequestGetInsights requestCanvasComponentAvgPctViewField() {
            return this.requestCanvasComponentAvgPctViewField(true);
        }

        public APIRequestGetInsights requestCanvasComponentAvgPctViewField(boolean value) {
            this.requestField("canvas_component_avg_pct_view", value);
            return this;
        }

        public APIRequestGetInsights requestClicksField() {
            return this.requestClicksField(true);
        }

        public APIRequestGetInsights requestClicksField(boolean value) {
            this.requestField("clicks", value);
            return this;
        }

        public APIRequestGetInsights requestCostPer10SecVideoViewField() {
            return this.requestCostPer10SecVideoViewField(true);
        }

        public APIRequestGetInsights requestCostPer10SecVideoViewField(boolean value) {
            this.requestField("cost_per_10_sec_video_view", value);
            return this;
        }

        public APIRequestGetInsights requestCostPerActionTypeField() {
            return this.requestCostPerActionTypeField(true);
        }

        public APIRequestGetInsights requestCostPerActionTypeField(boolean value) {
            this.requestField("cost_per_action_type", value);
            return this;
        }

        public APIRequestGetInsights requestCostPerEstimatedAdRecallersField() {
            return this.requestCostPerEstimatedAdRecallersField(true);
        }

        public APIRequestGetInsights requestCostPerEstimatedAdRecallersField(boolean value) {
            this.requestField("cost_per_estimated_ad_recallers", value);
            return this;
        }

        public APIRequestGetInsights requestCostPerInlineLinkClickField() {
            return this.requestCostPerInlineLinkClickField(true);
        }

        public APIRequestGetInsights requestCostPerInlineLinkClickField(boolean value) {
            this.requestField("cost_per_inline_link_click", value);
            return this;
        }

        public APIRequestGetInsights requestCostPerInlinePostEngagementField() {
            return this.requestCostPerInlinePostEngagementField(true);
        }

        public APIRequestGetInsights requestCostPerInlinePostEngagementField(boolean value) {
            this.requestField("cost_per_inline_post_engagement", value);
            return this;
        }

        public APIRequestGetInsights requestCostPerTotalActionField() {
            return this.requestCostPerTotalActionField(true);
        }

        public APIRequestGetInsights requestCostPerTotalActionField(boolean value) {
            this.requestField("cost_per_total_action", value);
            return this;
        }

        public APIRequestGetInsights requestCostPerUniqueActionTypeField() {
            return this.requestCostPerUniqueActionTypeField(true);
        }

        public APIRequestGetInsights requestCostPerUniqueActionTypeField(boolean value) {
            this.requestField("cost_per_unique_action_type", value);
            return this;
        }

        public APIRequestGetInsights requestCostPerUniqueClickField() {
            return this.requestCostPerUniqueClickField(true);
        }

        public APIRequestGetInsights requestCostPerUniqueClickField(boolean value) {
            this.requestField("cost_per_unique_click", value);
            return this;
        }

        public APIRequestGetInsights requestCostPerUniqueInlineLinkClickField() {
            return this.requestCostPerUniqueInlineLinkClickField(true);
        }

        public APIRequestGetInsights requestCostPerUniqueInlineLinkClickField(boolean value) {
            this.requestField("cost_per_unique_inline_link_click", value);
            return this;
        }

        public APIRequestGetInsights requestCountryField() {
            return this.requestCountryField(true);
        }

        public APIRequestGetInsights requestCountryField(boolean value) {
            this.requestField("country", value);
            return this;
        }

        public APIRequestGetInsights requestCpcField() {
            return this.requestCpcField(true);
        }

        public APIRequestGetInsights requestCpcField(boolean value) {
            this.requestField("cpc", value);
            return this;
        }

        public APIRequestGetInsights requestCpmField() {
            return this.requestCpmField(true);
        }

        public APIRequestGetInsights requestCpmField(boolean value) {
            this.requestField("cpm", value);
            return this;
        }

        public APIRequestGetInsights requestCppField() {
            return this.requestCppField(true);
        }

        public APIRequestGetInsights requestCppField(boolean value) {
            this.requestField("cpp", value);
            return this;
        }

        public APIRequestGetInsights requestCtrField() {
            return this.requestCtrField(true);
        }

        public APIRequestGetInsights requestCtrField(boolean value) {
            this.requestField("ctr", value);
            return this;
        }

        public APIRequestGetInsights requestDateStartField() {
            return this.requestDateStartField(true);
        }

        public APIRequestGetInsights requestDateStartField(boolean value) {
            this.requestField("date_start", value);
            return this;
        }

        public APIRequestGetInsights requestDateStopField() {
            return this.requestDateStopField(true);
        }

        public APIRequestGetInsights requestDateStopField(boolean value) {
            this.requestField("date_stop", value);
            return this;
        }

        public APIRequestGetInsights requestDeeplinkClicksField() {
            return this.requestDeeplinkClicksField(true);
        }

        public APIRequestGetInsights requestDeeplinkClicksField(boolean value) {
            this.requestField("deeplink_clicks", value);
            return this;
        }

        public APIRequestGetInsights requestDevicePlatformField() {
            return this.requestDevicePlatformField(true);
        }

        public APIRequestGetInsights requestDevicePlatformField(boolean value) {
            this.requestField("device_platform", value);
            return this;
        }

        public APIRequestGetInsights requestDmaField() {
            return this.requestDmaField(true);
        }

        public APIRequestGetInsights requestDmaField(boolean value) {
            this.requestField("dma", value);
            return this;
        }

        public APIRequestGetInsights requestEstimatedAdRecallRateField() {
            return this.requestEstimatedAdRecallRateField(true);
        }

        public APIRequestGetInsights requestEstimatedAdRecallRateField(boolean value) {
            this.requestField("estimated_ad_recall_rate", value);
            return this;
        }

        public APIRequestGetInsights requestEstimatedAdRecallersField() {
            return this.requestEstimatedAdRecallersField(true);
        }

        public APIRequestGetInsights requestEstimatedAdRecallersField(boolean value) {
            this.requestField("estimated_ad_recallers", value);
            return this;
        }

        public APIRequestGetInsights requestFrequencyField() {
            return this.requestFrequencyField(true);
        }

        public APIRequestGetInsights requestFrequencyField(boolean value) {
            this.requestField("frequency", value);
            return this;
        }

        public APIRequestGetInsights requestFrequencyValueField() {
            return this.requestFrequencyValueField(true);
        }

        public APIRequestGetInsights requestFrequencyValueField(boolean value) {
            this.requestField("frequency_value", value);
            return this;
        }

        public APIRequestGetInsights requestGenderField() {
            return this.requestGenderField(true);
        }

        public APIRequestGetInsights requestGenderField(boolean value) {
            this.requestField("gender", value);
            return this;
        }

        public APIRequestGetInsights requestHourlyStatsAggregatedByAdvertiserTimeZoneField() {
            return this.requestHourlyStatsAggregatedByAdvertiserTimeZoneField(true);
        }

        public APIRequestGetInsights requestHourlyStatsAggregatedByAdvertiserTimeZoneField(boolean value) {
            this.requestField("hourly_stats_aggregated_by_advertiser_time_zone", value);
            return this;
        }

        public APIRequestGetInsights requestHourlyStatsAggregatedByAudienceTimeZoneField() {
            return this.requestHourlyStatsAggregatedByAudienceTimeZoneField(true);
        }

        public APIRequestGetInsights requestHourlyStatsAggregatedByAudienceTimeZoneField(boolean value) {
            this.requestField("hourly_stats_aggregated_by_audience_time_zone", value);
            return this;
        }

        public APIRequestGetInsights requestImpressionDeviceField() {
            return this.requestImpressionDeviceField(true);
        }

        public APIRequestGetInsights requestImpressionDeviceField(boolean value) {
            this.requestField("impression_device", value);
            return this;
        }

        public APIRequestGetInsights requestImpressionsField() {
            return this.requestImpressionsField(true);
        }

        public APIRequestGetInsights requestImpressionsField(boolean value) {
            this.requestField("impressions", value);
            return this;
        }

        public APIRequestGetInsights requestImpressionsDummyField() {
            return this.requestImpressionsDummyField(true);
        }

        public APIRequestGetInsights requestImpressionsDummyField(boolean value) {
            this.requestField("impressions_dummy", value);
            return this;
        }

        public APIRequestGetInsights requestInlineLinkClickCtrField() {
            return this.requestInlineLinkClickCtrField(true);
        }

        public APIRequestGetInsights requestInlineLinkClickCtrField(boolean value) {
            this.requestField("inline_link_click_ctr", value);
            return this;
        }

        public APIRequestGetInsights requestInlineLinkClicksField() {
            return this.requestInlineLinkClicksField(true);
        }

        public APIRequestGetInsights requestInlineLinkClicksField(boolean value) {
            this.requestField("inline_link_clicks", value);
            return this;
        }

        public APIRequestGetInsights requestInlinePostEngagementField() {
            return this.requestInlinePostEngagementField(true);
        }

        public APIRequestGetInsights requestInlinePostEngagementField(boolean value) {
            this.requestField("inline_post_engagement", value);
            return this;
        }

        public APIRequestGetInsights requestNewsfeedAvgPositionField() {
            return this.requestNewsfeedAvgPositionField(true);
        }

        public APIRequestGetInsights requestNewsfeedAvgPositionField(boolean value) {
            this.requestField("newsfeed_avg_position", value);
            return this;
        }

        public APIRequestGetInsights requestNewsfeedClicksField() {
            return this.requestNewsfeedClicksField(true);
        }

        public APIRequestGetInsights requestNewsfeedClicksField(boolean value) {
            this.requestField("newsfeed_clicks", value);
            return this;
        }

        public APIRequestGetInsights requestNewsfeedImpressionsField() {
            return this.requestNewsfeedImpressionsField(true);
        }

        public APIRequestGetInsights requestNewsfeedImpressionsField(boolean value) {
            this.requestField("newsfeed_impressions", value);
            return this;
        }

        public APIRequestGetInsights requestObjectiveField() {
            return this.requestObjectiveField(true);
        }

        public APIRequestGetInsights requestObjectiveField(boolean value) {
            this.requestField("objective", value);
            return this;
        }

        public APIRequestGetInsights requestPlacePageIdField() {
            return this.requestPlacePageIdField(true);
        }

        public APIRequestGetInsights requestPlacePageIdField(boolean value) {
            this.requestField("place_page_id", value);
            return this;
        }

        public APIRequestGetInsights requestPlacePageNameField() {
            return this.requestPlacePageNameField(true);
        }

        public APIRequestGetInsights requestPlacePageNameField(boolean value) {
            this.requestField("place_page_name", value);
            return this;
        }

        public APIRequestGetInsights requestPlacementField() {
            return this.requestPlacementField(true);
        }

        public APIRequestGetInsights requestPlacementField(boolean value) {
            this.requestField("placement", value);
            return this;
        }

        public APIRequestGetInsights requestProductIdField() {
            return this.requestProductIdField(true);
        }

        public APIRequestGetInsights requestProductIdField(boolean value) {
            this.requestField("product_id", value);
            return this;
        }

        public APIRequestGetInsights requestReachField() {
            return this.requestReachField(true);
        }

        public APIRequestGetInsights requestReachField(boolean value) {
            this.requestField("reach", value);
            return this;
        }

        public APIRequestGetInsights requestRegionField() {
            return this.requestRegionField(true);
        }

        public APIRequestGetInsights requestRegionField(boolean value) {
            this.requestField("region", value);
            return this;
        }

        public APIRequestGetInsights requestRelevanceScoreField() {
            return this.requestRelevanceScoreField(true);
        }

        public APIRequestGetInsights requestRelevanceScoreField(boolean value) {
            this.requestField("relevance_score", value);
            return this;
        }

        public APIRequestGetInsights requestSocialClicksField() {
            return this.requestSocialClicksField(true);
        }

        public APIRequestGetInsights requestSocialClicksField(boolean value) {
            this.requestField("social_clicks", value);
            return this;
        }

        public APIRequestGetInsights requestSocialImpressionsField() {
            return this.requestSocialImpressionsField(true);
        }

        public APIRequestGetInsights requestSocialImpressionsField(boolean value) {
            this.requestField("social_impressions", value);
            return this;
        }

        public APIRequestGetInsights requestSocialReachField() {
            return this.requestSocialReachField(true);
        }

        public APIRequestGetInsights requestSocialReachField(boolean value) {
            this.requestField("social_reach", value);
            return this;
        }

        public APIRequestGetInsights requestSocialSpendField() {
            return this.requestSocialSpendField(true);
        }

        public APIRequestGetInsights requestSocialSpendField(boolean value) {
            this.requestField("social_spend", value);
            return this;
        }

        public APIRequestGetInsights requestSpendField() {
            return this.requestSpendField(true);
        }

        public APIRequestGetInsights requestSpendField(boolean value) {
            this.requestField("spend", value);
            return this;
        }

        public APIRequestGetInsights requestTotalActionValueField() {
            return this.requestTotalActionValueField(true);
        }

        public APIRequestGetInsights requestTotalActionValueField(boolean value) {
            this.requestField("total_action_value", value);
            return this;
        }

        public APIRequestGetInsights requestTotalActionsField() {
            return this.requestTotalActionsField(true);
        }

        public APIRequestGetInsights requestTotalActionsField(boolean value) {
            this.requestField("total_actions", value);
            return this;
        }

        public APIRequestGetInsights requestTotalUniqueActionsField() {
            return this.requestTotalUniqueActionsField(true);
        }

        public APIRequestGetInsights requestTotalUniqueActionsField(boolean value) {
            this.requestField("total_unique_actions", value);
            return this;
        }

        public APIRequestGetInsights requestUniqueActionsField() {
            return this.requestUniqueActionsField(true);
        }

        public APIRequestGetInsights requestUniqueActionsField(boolean value) {
            this.requestField("unique_actions", value);
            return this;
        }

        public APIRequestGetInsights requestUniqueClicksField() {
            return this.requestUniqueClicksField(true);
        }

        public APIRequestGetInsights requestUniqueClicksField(boolean value) {
            this.requestField("unique_clicks", value);
            return this;
        }

        public APIRequestGetInsights requestUniqueCtrField() {
            return this.requestUniqueCtrField(true);
        }

        public APIRequestGetInsights requestUniqueCtrField(boolean value) {
            this.requestField("unique_ctr", value);
            return this;
        }

        public APIRequestGetInsights requestUniqueImpressionsField() {
            return this.requestUniqueImpressionsField(true);
        }

        public APIRequestGetInsights requestUniqueImpressionsField(boolean value) {
            this.requestField("unique_impressions", value);
            return this;
        }

        public APIRequestGetInsights requestUniqueInlineLinkClickCtrField() {
            return this.requestUniqueInlineLinkClickCtrField(true);
        }

        public APIRequestGetInsights requestUniqueInlineLinkClickCtrField(boolean value) {
            this.requestField("unique_inline_link_click_ctr", value);
            return this;
        }

        public APIRequestGetInsights requestUniqueInlineLinkClicksField() {
            return this.requestUniqueInlineLinkClicksField(true);
        }

        public APIRequestGetInsights requestUniqueInlineLinkClicksField(boolean value) {
            this.requestField("unique_inline_link_clicks", value);
            return this;
        }

        public APIRequestGetInsights requestUniqueLinkClicksCtrField() {
            return this.requestUniqueLinkClicksCtrField(true);
        }

        public APIRequestGetInsights requestUniqueLinkClicksCtrField(boolean value) {
            this.requestField("unique_link_clicks_ctr", value);
            return this;
        }

        public APIRequestGetInsights requestUniqueSocialClicksField() {
            return this.requestUniqueSocialClicksField(true);
        }

        public APIRequestGetInsights requestUniqueSocialClicksField(boolean value) {
            this.requestField("unique_social_clicks", value);
            return this;
        }

        public APIRequestGetInsights requestUniqueSocialImpressionsField() {
            return this.requestUniqueSocialImpressionsField(true);
        }

        public APIRequestGetInsights requestUniqueSocialImpressionsField(boolean value) {
            this.requestField("unique_social_impressions", value);
            return this;
        }

        public APIRequestGetInsights requestVideo10SecWatchedActionsField() {
            return this.requestVideo10SecWatchedActionsField(true);
        }

        public APIRequestGetInsights requestVideo10SecWatchedActionsField(boolean value) {
            this.requestField("video_10_sec_watched_actions", value);
            return this;
        }

        public APIRequestGetInsights requestVideo15SecWatchedActionsField() {
            return this.requestVideo15SecWatchedActionsField(true);
        }

        public APIRequestGetInsights requestVideo15SecWatchedActionsField(boolean value) {
            this.requestField("video_15_sec_watched_actions", value);
            return this;
        }

        public APIRequestGetInsights requestVideo30SecWatchedActionsField() {
            return this.requestVideo30SecWatchedActionsField(true);
        }

        public APIRequestGetInsights requestVideo30SecWatchedActionsField(boolean value) {
            this.requestField("video_30_sec_watched_actions", value);
            return this;
        }

        public APIRequestGetInsights requestVideoAvgPctWatchedActionsField() {
            return this.requestVideoAvgPctWatchedActionsField(true);
        }

        public APIRequestGetInsights requestVideoAvgPctWatchedActionsField(boolean value) {
            this.requestField("video_avg_pct_watched_actions", value);
            return this;
        }

        public APIRequestGetInsights requestVideoAvgPercentWatchedActionsField() {
            return this.requestVideoAvgPercentWatchedActionsField(true);
        }

        public APIRequestGetInsights requestVideoAvgPercentWatchedActionsField(boolean value) {
            this.requestField("video_avg_percent_watched_actions", value);
            return this;
        }

        public APIRequestGetInsights requestVideoAvgSecWatchedActionsField() {
            return this.requestVideoAvgSecWatchedActionsField(true);
        }

        public APIRequestGetInsights requestVideoAvgSecWatchedActionsField(boolean value) {
            this.requestField("video_avg_sec_watched_actions", value);
            return this;
        }

        public APIRequestGetInsights requestVideoAvgTimeWatchedActionsField() {
            return this.requestVideoAvgTimeWatchedActionsField(true);
        }

        public APIRequestGetInsights requestVideoAvgTimeWatchedActionsField(boolean value) {
            this.requestField("video_avg_time_watched_actions", value);
            return this;
        }

        public APIRequestGetInsights requestVideoCompleteWatchedActionsField() {
            return this.requestVideoCompleteWatchedActionsField(true);
        }

        public APIRequestGetInsights requestVideoCompleteWatchedActionsField(boolean value) {
            this.requestField("video_complete_watched_actions", value);
            return this;
        }

        public APIRequestGetInsights requestVideoP100WatchedActionsField() {
            return this.requestVideoP100WatchedActionsField(true);
        }

        public APIRequestGetInsights requestVideoP100WatchedActionsField(boolean value) {
            this.requestField("video_p100_watched_actions", value);
            return this;
        }

        public APIRequestGetInsights requestVideoP25WatchedActionsField() {
            return this.requestVideoP25WatchedActionsField(true);
        }

        public APIRequestGetInsights requestVideoP25WatchedActionsField(boolean value) {
            this.requestField("video_p25_watched_actions", value);
            return this;
        }

        public APIRequestGetInsights requestVideoP50WatchedActionsField() {
            return this.requestVideoP50WatchedActionsField(true);
        }

        public APIRequestGetInsights requestVideoP50WatchedActionsField(boolean value) {
            this.requestField("video_p50_watched_actions", value);
            return this;
        }

        public APIRequestGetInsights requestVideoP75WatchedActionsField() {
            return this.requestVideoP75WatchedActionsField(true);
        }

        public APIRequestGetInsights requestVideoP75WatchedActionsField(boolean value) {
            this.requestField("video_p75_watched_actions", value);
            return this;
        }

        public APIRequestGetInsights requestVideoP95WatchedActionsField() {
            return this.requestVideoP95WatchedActionsField(true);
        }

        public APIRequestGetInsights requestVideoP95WatchedActionsField(boolean value) {
            this.requestField("video_p95_watched_actions", value);
            return this;
        }

        public APIRequestGetInsights requestWebsiteClicksField() {
            return this.requestWebsiteClicksField(true);
        }

        public APIRequestGetInsights requestWebsiteClicksField(boolean value) {
            this.requestField("website_clicks", value);
            return this;
        }

        public APIRequestGetInsights requestWebsiteCtrField() {
            return this.requestWebsiteCtrField(true);
        }

        public APIRequestGetInsights requestWebsiteCtrField(boolean value) {
            this.requestField("website_ctr", value);
            return this;
        }
    }

    public static class APIRequestGet extends APIRequest<AdReportRun> {

        AdReportRun lastResponse = null;

        @Override
        public AdReportRun getLastResponse() {
            return lastResponse;
        }

        public static final String[] PARAMS = {};

        public static final String[] FIELDS = { "account_id", "async_percent_completion", "async_status",
                "date_start", "date_stop", "emails", "friendly_name", "id", "is_bookmarked", "is_running",
                "schedule_id", "time_completed", "time_ref", };

        @Override
        public AdReportRun parseResponse(String response) throws APIException {
            return AdReportRun.parseResponse(response, getContext(), this).head();
        }

        @Override
        public AdReportRun execute() throws APIException {
            return execute(new HashMap<String, Object>());
        }

        @Override
        public AdReportRun execute(Map<String, Object> extraParams) throws APIException {
            lastResponse = parseResponse(executeInternal(extraParams));
            return lastResponse;
        }

        public APIRequestGet(String nodeId, APIContext context) {
            super(context, nodeId, "/", "GET", Arrays.asList(PARAMS));
        }

        @Override
        public APIRequestGet setParam(String param, Object value) {
            setParamInternal(param, value);
            return this;
        }

        @Override
        public APIRequestGet setParams(Map<String, Object> params) {
            setParamsInternal(params);
            return this;
        }

        public APIRequestGet requestAllFields() {
            return this.requestAllFields(true);
        }

        public APIRequestGet requestAllFields(boolean value) {
            for (String field : FIELDS) {
                this.requestField(field, value);
            }
            return this;
        }

        @Override
        public APIRequestGet requestFields(List<String> fields) {
            return this.requestFields(fields, true);
        }

        @Override
        public APIRequestGet requestFields(List<String> fields, boolean value) {
            for (String field : fields) {
                this.requestField(field, value);
            }
            return this;
        }

        @Override
        public APIRequestGet requestField(String field) {
            this.requestField(field, true);
            return this;
        }

        @Override
        public APIRequestGet requestField(String field, boolean value) {
            this.requestFieldInternal(field, value);
            return this;
        }

        public APIRequestGet requestAccountIdField() {
            return this.requestAccountIdField(true);
        }

        public APIRequestGet requestAccountIdField(boolean value) {
            this.requestField("account_id", value);
            return this;
        }

        public APIRequestGet requestAsyncPercentCompletionField() {
            return this.requestAsyncPercentCompletionField(true);
        }

        public APIRequestGet requestAsyncPercentCompletionField(boolean value) {
            this.requestField("async_percent_completion", value);
            return this;
        }

        public APIRequestGet requestAsyncStatusField() {
            return this.requestAsyncStatusField(true);
        }

        public APIRequestGet requestAsyncStatusField(boolean value) {
            this.requestField("async_status", value);
            return this;
        }

        public APIRequestGet requestDateStartField() {
            return this.requestDateStartField(true);
        }

        public APIRequestGet requestDateStartField(boolean value) {
            this.requestField("date_start", value);
            return this;
        }

        public APIRequestGet requestDateStopField() {
            return this.requestDateStopField(true);
        }

        public APIRequestGet requestDateStopField(boolean value) {
            this.requestField("date_stop", value);
            return this;
        }

        public APIRequestGet requestEmailsField() {
            return this.requestEmailsField(true);
        }

        public APIRequestGet requestEmailsField(boolean value) {
            this.requestField("emails", value);
            return this;
        }

        public APIRequestGet requestFriendlyNameField() {
            return this.requestFriendlyNameField(true);
        }

        public APIRequestGet requestFriendlyNameField(boolean value) {
            this.requestField("friendly_name", value);
            return this;
        }

        public APIRequestGet requestIdField() {
            return this.requestIdField(true);
        }

        public APIRequestGet requestIdField(boolean value) {
            this.requestField("id", value);
            return this;
        }

        public APIRequestGet requestIsBookmarkedField() {
            return this.requestIsBookmarkedField(true);
        }

        public APIRequestGet requestIsBookmarkedField(boolean value) {
            this.requestField("is_bookmarked", value);
            return this;
        }

        public APIRequestGet requestIsRunningField() {
            return this.requestIsRunningField(true);
        }

        public APIRequestGet requestIsRunningField(boolean value) {
            this.requestField("is_running", value);
            return this;
        }

        public APIRequestGet requestScheduleIdField() {
            return this.requestScheduleIdField(true);
        }

        public APIRequestGet requestScheduleIdField(boolean value) {
            this.requestField("schedule_id", value);
            return this;
        }

        public APIRequestGet requestTimeCompletedField() {
            return this.requestTimeCompletedField(true);
        }

        public APIRequestGet requestTimeCompletedField(boolean value) {
            this.requestField("time_completed", value);
            return this;
        }

        public APIRequestGet requestTimeRefField() {
            return this.requestTimeRefField(true);
        }

        public APIRequestGet requestTimeRefField(boolean value) {
            this.requestField("time_ref", value);
            return this;
        }
    }

    public static enum EnumActionAttributionWindows {
        @SerializedName("1d_view")
        VALUE_1D_VIEW("1d_view"), @SerializedName("7d_view")
        VALUE_7D_VIEW("7d_view"), @SerializedName("28d_view")
        VALUE_28D_VIEW("28d_view"), @SerializedName("1d_click")
        VALUE_1D_CLICK("1d_click"), @SerializedName("7d_click")
        VALUE_7D_CLICK("7d_click"), @SerializedName("28d_click")
        VALUE_28D_CLICK("28d_click"), @SerializedName("default")
        VALUE_DEFAULT("default"), NULL(null);

        private String value;

        private EnumActionAttributionWindows(String value) {
            this.value = value;
        }

        @Override
        public String toString() {
            return value;
        }
    }

    public static enum EnumActionBreakdowns {
        @SerializedName("action_canvas_component_name")
        VALUE_ACTION_CANVAS_COMPONENT_NAME(
                "action_canvas_component_name"), @SerializedName("action_carousel_card_id")
        VALUE_ACTION_CAROUSEL_CARD_ID("action_carousel_card_id"), @SerializedName("action_carousel_card_name")
        VALUE_ACTION_CAROUSEL_CARD_NAME("action_carousel_card_name"), @SerializedName("action_destination")
        VALUE_ACTION_DESTINATION("action_destination"), @SerializedName("action_device")
        VALUE_ACTION_DEVICE("action_device"), @SerializedName("action_reaction")
        VALUE_ACTION_REACTION("action_reaction"), @SerializedName("action_target_id")
        VALUE_ACTION_TARGET_ID("action_target_id"), @SerializedName("action_type")
        VALUE_ACTION_TYPE("action_type"), @SerializedName("action_video_sound")
        VALUE_ACTION_VIDEO_SOUND("action_video_sound"), @SerializedName("action_video_type")
        VALUE_ACTION_VIDEO_TYPE("action_video_type"), NULL(null);

        private String value;

        private EnumActionBreakdowns(String value) {
            this.value = value;
        }

        @Override
        public String toString() {
            return value;
        }
    }

    public static enum EnumActionReportTime {
        @SerializedName("impression")
        VALUE_IMPRESSION("impression"), @SerializedName("conversion")
        VALUE_CONVERSION("conversion"), NULL(null);

        private String value;

        private EnumActionReportTime(String value) {
            this.value = value;
        }

        @Override
        public String toString() {
            return value;
        }
    }

    public static enum EnumBreakdowns {
        @SerializedName("age")
        VALUE_AGE("age"), @SerializedName("country")
        VALUE_COUNTRY("country"), @SerializedName("dma")
        VALUE_DMA("dma"), @SerializedName("gender")
        VALUE_GENDER("gender"), @SerializedName("frequency_value")
        VALUE_FREQUENCY_VALUE("frequency_value"), @SerializedName("hourly_stats_aggregated_by_advertiser_time_zone")
        VALUE_HOURLY_STATS_AGGREGATED_BY_ADVERTISER_TIME_ZONE(
                "hourly_stats_aggregated_by_advertiser_time_zone"), @SerializedName("hourly_stats_aggregated_by_audience_time_zone")
        VALUE_HOURLY_STATS_AGGREGATED_BY_AUDIENCE_TIME_ZONE(
                "hourly_stats_aggregated_by_audience_time_zone"), @SerializedName("impression_device")
        VALUE_IMPRESSION_DEVICE("impression_device"), @SerializedName("place_page_id")
        VALUE_PLACE_PAGE_ID("place_page_id"), @SerializedName("placement")
        VALUE_PLACEMENT("placement"), @SerializedName("publisher_platform")
        VALUE_PUBLISHER_PLATFORM("publisher_platform"), @SerializedName("platform_position")
        VALUE_PLATFORM_POSITION("platform_position"), @SerializedName("device_platform")
        VALUE_DEVICE_PLATFORM("device_platform"), @SerializedName("product_id")
        VALUE_PRODUCT_ID("product_id"), @SerializedName("region")
        VALUE_REGION("region"), NULL(null);

        private String value;

        private EnumBreakdowns(String value) {
            this.value = value;
        }

        @Override
        public String toString() {
            return value;
        }
    }

    public static enum EnumDatePreset {
        @SerializedName("today")
        VALUE_TODAY("today"), @SerializedName("yesterday")
        VALUE_YESTERDAY("yesterday"), @SerializedName("last_3_days")
        VALUE_LAST_3_DAYS("last_3_days"), @SerializedName("this_week")
        VALUE_THIS_WEEK("this_week"), @SerializedName("last_week")
        VALUE_LAST_WEEK("last_week"), @SerializedName("last_7_days")
        VALUE_LAST_7_DAYS("last_7_days"), @SerializedName("last_14_days")
        VALUE_LAST_14_DAYS("last_14_days"), @SerializedName("last_28_days")
        VALUE_LAST_28_DAYS("last_28_days"), @SerializedName("last_30_days")
        VALUE_LAST_30_DAYS("last_30_days"), @SerializedName("last_90_days")
        VALUE_LAST_90_DAYS("last_90_days"), @SerializedName("this_month")
        VALUE_THIS_MONTH("this_month"), @SerializedName("last_month")
        VALUE_LAST_MONTH("last_month"), @SerializedName("this_quarter")
        VALUE_THIS_QUARTER("this_quarter"), @SerializedName("last_3_months")
        VALUE_LAST_3_MONTHS("last_3_months"), @SerializedName("lifetime")
        VALUE_LIFETIME("lifetime"), NULL(null);

        private String value;

        private EnumDatePreset(String value) {
            this.value = value;
        }

        @Override
        public String toString() {
            return value;
        }
    }

    public static enum EnumSummary {
        @SerializedName("id")
        VALUE_ID("id"), @SerializedName("account_id")
        VALUE_ACCOUNT_ID("account_id"), @SerializedName("async_percent_completion")
        VALUE_ASYNC_PERCENT_COMPLETION("async_percent_completion"), @SerializedName("async_status")
        VALUE_ASYNC_STATUS("async_status"), @SerializedName("date_start")
        VALUE_DATE_START("date_start"), @SerializedName("date_stop")
        VALUE_DATE_STOP("date_stop"), @SerializedName("emails")
        VALUE_EMAILS("emails"), @SerializedName("friendly_name")
        VALUE_FRIENDLY_NAME("friendly_name"), @SerializedName("is_bookmarked")
        VALUE_IS_BOOKMARKED("is_bookmarked"), @SerializedName("is_running")
        VALUE_IS_RUNNING("is_running"), @SerializedName("schedule_id")
        VALUE_SCHEDULE_ID("schedule_id"), @SerializedName("time_completed")
        VALUE_TIME_COMPLETED("time_completed"), @SerializedName("time_ref")
        VALUE_TIME_REF("time_ref"), NULL(null);

        private String value;

        private EnumSummary(String value) {
            this.value = value;
        }

        @Override
        public String toString() {
            return value;
        }
    }

    public static enum EnumLevel {
        @SerializedName("ad")
        VALUE_AD("ad"), @SerializedName("adset")
        VALUE_ADSET("adset"), @SerializedName("campaign")
        VALUE_CAMPAIGN("campaign"), @SerializedName("account")
        VALUE_ACCOUNT("account"), NULL(null);

        private String value;

        private EnumLevel(String value) {
            this.value = value;
        }

        @Override
        public String toString() {
            return value;
        }
    }

    public static enum EnumSummaryActionBreakdowns {
        @SerializedName("action_canvas_component_name")
        VALUE_ACTION_CANVAS_COMPONENT_NAME(
                "action_canvas_component_name"), @SerializedName("action_carousel_card_id")
        VALUE_ACTION_CAROUSEL_CARD_ID("action_carousel_card_id"), @SerializedName("action_carousel_card_name")
        VALUE_ACTION_CAROUSEL_CARD_NAME("action_carousel_card_name"), @SerializedName("action_destination")
        VALUE_ACTION_DESTINATION("action_destination"), @SerializedName("action_device")
        VALUE_ACTION_DEVICE("action_device"), @SerializedName("action_reaction")
        VALUE_ACTION_REACTION("action_reaction"), @SerializedName("action_target_id")
        VALUE_ACTION_TARGET_ID("action_target_id"), @SerializedName("action_type")
        VALUE_ACTION_TYPE("action_type"), @SerializedName("action_video_sound")
        VALUE_ACTION_VIDEO_SOUND("action_video_sound"), @SerializedName("action_video_type")
        VALUE_ACTION_VIDEO_TYPE("action_video_type"), NULL(null);

        private String value;

        private EnumSummaryActionBreakdowns(String value) {
            this.value = value;
        }

        @Override
        public String toString() {
            return value;
        }
    }

    synchronized /*package*/ static Gson getGson() {
        if (gson != null) {
            return gson;
        } else {
            gson = new GsonBuilder().excludeFieldsWithModifiers(Modifier.STATIC)
                    .excludeFieldsWithModifiers(Modifier.PROTECTED).disableHtmlEscaping().create();
        }
        return gson;
    }

    public AdReportRun copyFrom(AdReportRun instance) {
        this.mAccountId = instance.mAccountId;
        this.mAsyncPercentCompletion = instance.mAsyncPercentCompletion;
        this.mAsyncStatus = instance.mAsyncStatus;
        this.mDateStart = instance.mDateStart;
        this.mDateStop = instance.mDateStop;
        this.mEmails = instance.mEmails;
        this.mFriendlyName = instance.mFriendlyName;
        this.mId = instance.mId;
        this.mIsBookmarked = instance.mIsBookmarked;
        this.mIsRunning = instance.mIsRunning;
        this.mScheduleId = instance.mScheduleId;
        this.mTimeCompleted = instance.mTimeCompleted;
        this.mTimeRef = instance.mTimeRef;
        this.context = instance.context;
        this.rawValue = instance.rawValue;
        return this;
    }

    public static APIRequest.ResponseParser<AdReportRun> getParser() {
        return new APIRequest.ResponseParser<AdReportRun>() {
            public APINodeList<AdReportRun> parseResponse(String response, APIContext context,
                    APIRequest<AdReportRun> request) throws MalformedResponseException {
                return AdReportRun.parseResponse(response, context, request);
            }
        };
    }
}