package com.malcom.library.android.module.campaign;
import com.malcom.library.android.utils.JSONHelper;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.*;
/**
* MCMCampaignDTO.
* Class to store information about a campaign.
*/
public class MCMCampaignDTO {
public static enum CampaignType {IN_APP_PROMOTION, IN_APP_RATE_MY_APP, IN_APP_CROSS_SELLING, IN_APP_EXTERNAL_URL};
public static enum CampaignPosition {BOTTOM, TOP, FULL_SCREEN, MIDDLE_PORTRAIT, MIDDLE_LANDSCAPE};
//JSON tags
private static final String ATTR_CAMPAIGN_ID = "id";
private static final String ATTR_NAME = "name";
private static final String ATTR_START = "start";
private static final String ATTR_END = "end";
private static final String ATTR_CREATED_ON = "createdOn";
private static final String ATTR_DESCRIPTION_FEATURE = "descriptionFeature";
private static final String ATTR_PROMOTION_DESCRIPTION = "promotionDescription";
private static final String ATTR_TYPE = "type";
private static final String ATTR_MEDIA_FEATURE = "mediaFeature";
private static final String ATTR_MEDIA = "media";
private static final String ATTR_CAMPAIGN_POSITION = "position";
private static final String ATTR_PROMOTION_FEATURE = "promotionFeature";
private static final String ATTR_PROMOTION_TYPE = "promotionType";
private static final String ATTR_PROMOTION_IDENTIFIER = "promotionIdentifier";
private static final String ATTR_EXTERNAL_PROMOTION_FEATURE = "externalPromotionFeature";
private static final String ATTR_EXTERNAL_URL = "externalUrl";
private static final String ATTR_CLIENT_LIMIT_FEATURE = "clientLimitFeatures";
private static final String ATTR_CLIENT_LIMIT_TYPE = "clientLimitType";
private static final String ATTR_LIMIT_VALUE = "limitValue";
private static final String ATTR_CUSTOM_PARAMS = "customParamsFeature";
private static final String ATTR_CUSTOM_PARAMS_PROPERTIES = "properties";
private static final String ATTR_SERVER_ORDER_FEATURE = "serverOrderFeature";
private static final String ATTR_WEIGHT_CAMPAIGN = "weight";
//Attributes
private String campaignId;
private String name;
private String start;
private String end;
private String createdOn;
private String campaignDescription;
private CampaignType type;
private String media;
private CampaignPosition campaignPosition;
private String promotionType;
private String promotionIdentifier;
private String externalPromotionURL;
private Map<String, String> clientLimitFeatures;
private Map<String, Object> customParams;
private int weight;
public MCMCampaignDTO(JSONObject json) {
String typeJSON = null;
try {
campaignId = json.getString(ATTR_CAMPAIGN_ID);
name = json.getString(ATTR_NAME);
start = json.getString(ATTR_START);
if (json.has(ATTR_END)) //Optional
end = json.getString(ATTR_END);
createdOn = json.getString(ATTR_CREATED_ON);
if (json.has(ATTR_DESCRIPTION_FEATURE))
campaignDescription = json.getJSONObject(ATTR_DESCRIPTION_FEATURE).getString(ATTR_PROMOTION_DESCRIPTION);
typeJSON = json.getString(ATTR_TYPE);
if (json.has(ATTR_MEDIA_FEATURE))
hydrateMediaFeature(json.getJSONObject(ATTR_MEDIA_FEATURE));
if (json.has(ATTR_PROMOTION_FEATURE))
hydratePromotionFeature(json.getJSONObject(ATTR_PROMOTION_FEATURE));
if (json.has(ATTR_EXTERNAL_PROMOTION_FEATURE))
hydrateExternalPromotionFeature(json.getJSONObject(ATTR_EXTERNAL_PROMOTION_FEATURE));
if (json.has(ATTR_CLIENT_LIMIT_FEATURE))
hydrateClientLimitFeatures(json.getJSONArray(ATTR_CLIENT_LIMIT_FEATURE));
if (json.has(ATTR_CUSTOM_PARAMS) && json.getJSONObject(ATTR_CUSTOM_PARAMS).has(ATTR_CUSTOM_PARAMS_PROPERTIES))
customParams = JSONHelper.toMap(json.getJSONObject(ATTR_CUSTOM_PARAMS).getJSONObject(ATTR_CUSTOM_PARAMS_PROPERTIES));
if (json.has(ATTR_SERVER_ORDER_FEATURE) && json.getJSONObject(ATTR_SERVER_ORDER_FEATURE).has(ATTR_WEIGHT_CAMPAIGN)) {
weight = json.getJSONObject(ATTR_SERVER_ORDER_FEATURE).getInt(ATTR_WEIGHT_CAMPAIGN);
} else {
weight = 1;
}
} catch (JSONException e) {
e.printStackTrace();
}
if (typeJSON != null) {
if (typeJSON.equalsIgnoreCase(CampaignType.IN_APP_PROMOTION.name())) {
type = CampaignType.IN_APP_PROMOTION;
} else if (typeJSON.equalsIgnoreCase(CampaignType.IN_APP_RATE_MY_APP.name())) {
type = CampaignType.IN_APP_RATE_MY_APP;
} else if (typeJSON.equalsIgnoreCase(CampaignType.IN_APP_CROSS_SELLING.name())) {
type = CampaignType.IN_APP_CROSS_SELLING;
} else if (typeJSON.equalsIgnoreCase(CampaignType.IN_APP_EXTERNAL_URL.name())) {
type = CampaignType.IN_APP_EXTERNAL_URL;
} else {
type = CampaignType.IN_APP_PROMOTION;
}
}
}
private void hydrateMediaFeature(JSONObject json) {
String position = null;
try {
if (json.has(ATTR_MEDIA))
media = (String) json.get(ATTR_MEDIA);
if (json.has(ATTR_CAMPAIGN_POSITION))
position = (String) json.getString(ATTR_CAMPAIGN_POSITION);
} catch (JSONException e) {
e.printStackTrace();
}
if (position != null) {
if (position.equals(CampaignPosition.BOTTOM.name())) {
campaignPosition = CampaignPosition.BOTTOM;
} else if (position.equals(CampaignPosition.TOP.name())) {
campaignPosition = CampaignPosition.TOP;
} else if (position.equals(CampaignPosition.FULL_SCREEN.name())) {
campaignPosition = CampaignPosition.FULL_SCREEN;
} else if (position.equals(CampaignPosition.MIDDLE_PORTRAIT.name())) {
campaignPosition = CampaignPosition.MIDDLE_PORTRAIT;
} else if (position.equals(CampaignPosition.MIDDLE_LANDSCAPE.name())) {
campaignPosition = CampaignPosition.MIDDLE_LANDSCAPE;
} else {
//if there is no position, set Bottom by default
campaignPosition = CampaignPosition.BOTTOM;
}
} else {
//if there is no position, set Bottom by default
campaignPosition = CampaignPosition.BOTTOM;
}
}
private void hydratePromotionFeature(JSONObject json) {
try {
promotionType = (String) json.get(ATTR_PROMOTION_TYPE);
promotionIdentifier = (String) json.getString(ATTR_PROMOTION_IDENTIFIER);
} catch (JSONException e) {
e.printStackTrace();
}
}
private void hydrateExternalPromotionFeature(JSONObject json) {
try {
externalPromotionURL = (String) json.get(ATTR_EXTERNAL_URL);
} catch (JSONException e) {
e.printStackTrace();
}
}
private void hydrateClientLimitFeatures(JSONArray jsonArray) {
clientLimitFeatures = new HashMap<String, String>();
for (int i=0; i<jsonArray.length(); i++) {
try {
JSONObject jsonObject = jsonArray.getJSONObject(i);
clientLimitFeatures.put(jsonObject.getString(ATTR_CLIENT_LIMIT_TYPE),
jsonObject.getString(ATTR_LIMIT_VALUE));
} catch (JSONException e) {
e.printStackTrace();
}
}
}
public String getCampaignId() {
return campaignId;
}
public String getName() {
return name;
}
public String getStart() {
return start;
}
public String getEnd() {
return end;
}
public String getCreatedOn() {
return createdOn;
}
public String getCampaignDescription() {
return campaignDescription;
}
public CampaignType getType() {
return type;
}
public String getMedia() {
return media;
}
public CampaignPosition getCampaignPosition() {
return campaignPosition;
}
public void setCampaignPosition(CampaignPosition campaignPosition) {
this.campaignPosition = campaignPosition;
}
public String getPromotionType() {
return promotionType;
}
public String getPromotionIdentifier() {
return promotionIdentifier;
}
public String getExternalPromotionURL() {
return externalPromotionURL;
}
public void setExternalPromotionURL(String externalPromotionURL) {
this.externalPromotionURL = externalPromotionURL;
}
public String getClientLimitFeature(String key) {
if (clientLimitFeatures != null) {
return clientLimitFeatures.get(key);
} else {
return null;
}
}
public Object getCustomParam(String key) {
if (customParams != null) {
return customParams.get(key);
} else {
return null;
}
}
public int getWeight() {
return weight;
}
public boolean isFullScreen() {
return (getCampaignPosition() != CampaignPosition.BOTTOM &&
getCampaignPosition() != CampaignPosition.TOP);
}
}