package org.wordpress.android.ui.stats.models;
import android.text.TextUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.StringUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class VisitsModel extends BaseStatsModel {
private String mFields; // Holds a JSON Object
private String mUnit;
private String mDate;
private long mBlogID;
private List<VisitModel> mVisits;
public VisitsModel(long blogID, JSONObject response) throws JSONException {
this.setBlogID(blogID);
this.setDate(response.getString("date"));
this.setUnit(response.getString("unit"));
this.setFields(response.getJSONArray("fields").toString());
JSONArray dataJSON;
try {
dataJSON = response.getJSONArray("data");
} catch (JSONException e) {
AppLog.e(AppLog.T.STATS, this.getClass().getName() + " cannot convert the data field to a JSON array", e);
dataJSON = new JSONArray();
}
if (dataJSON == null || dataJSON.length() == 0) {
mVisits = new ArrayList<>(0);
} else {
// Read the position/index of each field in the response
HashMap<String, Integer> columnsMapping = new HashMap<>(6);
final JSONArray fieldsJSON = getFieldsJSON();
if (fieldsJSON == null || fieldsJSON.length() == 0) {
mVisits = new ArrayList<>(0);
} else {
try {
for (int i = 0; i < fieldsJSON.length(); i++) {
final String field = fieldsJSON.getString(i);
columnsMapping.put(field, i);
}
} catch (JSONException e) {
AppLog.e(AppLog.T.STATS, "Cannot read the parameter fields from the JSON response." +
"Response: " + response.toString(), e);
mVisits = new ArrayList<>(0);
}
}
int viewsColumnIndex = columnsMapping.get("views");
int visitorsColumnIndex = columnsMapping.get("visitors");
int likesColumnIndex = columnsMapping.get("likes");
int commentsColumnIndex = columnsMapping.get("comments");
int periodColumnIndex = columnsMapping.get("period");
int numPoints = dataJSON.length();
mVisits = new ArrayList<>(numPoints);
for (int i = 0; i < numPoints; i++) {
try {
JSONArray currentDayData = dataJSON.getJSONArray(i);
VisitModel currentVisitModel = new VisitModel();
currentVisitModel.setBlogID(getBlogID());
currentVisitModel.setPeriod(currentDayData.getString(periodColumnIndex));
currentVisitModel.setViews(currentDayData.getInt(viewsColumnIndex));
currentVisitModel.setVisitors(currentDayData.getInt(visitorsColumnIndex));
currentVisitModel.setComments(currentDayData.getInt(commentsColumnIndex));
currentVisitModel.setLikes(currentDayData.getInt(likesColumnIndex));
mVisits.add(currentVisitModel);
} catch (JSONException e) {
AppLog.e(AppLog.T.STATS, "Cannot read the Visit item at index " + i
+ " Response: " + response.toString(), e);
}
}
}
}
public List<VisitModel> getVisits() {
return mVisits;
}
public long getBlogID() {
return mBlogID;
}
private void setBlogID(long blogID) {
this.mBlogID = blogID;
}
public String getDate() {
return mDate;
}
private void setDate(String date) {
this.mDate = date;
}
public String getUnit() {
return mUnit;
}
private void setUnit(String unit) {
this.mUnit = unit;
}
private JSONArray getFieldsJSON() {
JSONArray jArray;
try {
String categories = StringUtils.unescapeHTML(this.getFields() != null ? this.getFields() : "[]");
if (TextUtils.isEmpty(categories)) {
jArray = new JSONArray();
} else {
jArray = new JSONArray(categories);
}
} catch (JSONException e) {
AppLog.e(AppLog.T.STATS, this.getClass().getName() + " cannot convert the string to JSON", e);
return null;
}
return jArray;
}
private void setFields(String fields) {
this.mFields = fields;
}
private String getFields() {
return mFields;
}
}