package com.ucb.dcm.data;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.Toast;
import com.ucb.dcm.MainActivity;
import com.ucb.dcm.net.ExecuteURLDownload;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
/**
* Created by kurtguenther on 6/6/13.
*/
public class DataService {
private static final String TAG = "DataService";
////////
// Static accessor
////////
private static DataService mSharedService;
public static final String JSON_URL = "http://www.delclosemarathon.com/dcm15/schedules/viewjson";
public static DataService getSharedService()
{
return mSharedService;
}
public Context context;
public static void Initialize(Context context)
{
DataService api = new DataService();
api.context = context;
mSharedService = api;
}
//TODO need logic for when to update
public boolean shouldUpdate(){
return getVenues().size() == 0;
}
public boolean refreshData(){
updateFromServer(null);
return true;
}
////////
// Downloading the data
////////
private class UpdateServerListener implements ExecuteURLDownload.ExecuteURLDownloadListener{
ProgressDialog dialog;
public UpdateServerListener(ProgressDialog dialog){
this.dialog = dialog;
}
@Override
public void onSuccess(JSONObject result) {
Log.v(TAG,"Schedule download complete. Beginning processing.");
//Backup Favorites
Cursor c = DataService.getSharedService().getFavorites();
final ArrayList<Integer> favorites = new ArrayList<Integer>();
while(c.moveToNext()){
int show_id = c.getInt(c.getColumnIndex("show_id"));
if(!favorites.contains(show_id)){
favorites.add(show_id);
}
}
new Venue().deleteAll(DBHelper.getSharedService().getWritableDatabase());
new Show().deleteAll(DBHelper.getSharedService().getWritableDatabase());
new Performance().deleteAll(DBHelper.getSharedService().getWritableDatabase());
dialog.setMessage("Processing Venues.");
AsyncTask<JSONObject, Integer, String> dbUpdate = new AsyncTask<JSONObject, Integer, String>() {
@Override
protected String doInBackground(JSONObject... params) {
JSONObject js = params[0];
Activity aaa = (Activity) context;
aaa.runOnUiThread(new Runnable() {
public void run() {
dialog.setMessage("Processing Venues.");
}
});
//dialog.setMessage("Processing Venues.");
processVenues(js);
aaa.runOnUiThread(new Runnable() {
public void run() {
dialog.setMessage("Processing Shows.");
}
});
//dialog.setMessage("Processing Shows.");
processShows(js);
aaa.runOnUiThread(new Runnable() {
public void run() {
dialog.setMessage("Processing Schedules.");
}
});
//dialog.setMessage("Processing Schedules.");
processSchedules(js);
//restore favorites
for(Integer i : favorites){
Show s = Show.getById(i);
if(i != null){
s.addFavorite();
}
}
aaa.runOnUiThread(new Runnable() {
public void run() {
dialog.hide();
}
});
aaa.runOnUiThread(new Runnable() {
@Override
public void run() {
((MainActivity)context).onScheduleDownloaded();
}
});
return null;
}
};
dbUpdate.execute(result);
}
@Override
public void onError(JSONObject result) {
Toast t = Toast.makeText(context, "Error downloading the schedule", Toast.LENGTH_LONG);
t.show();
}
}
public void updateFromServer(ExecuteURLDownload.ExecuteURLDownloadListener listener){
try {
Log.v(TAG,"Requesting schedule from server: " + JSON_URL);
HttpURLConnection jsonFile = (HttpURLConnection) new URL(JSON_URL).openConnection();
ProgressDialog dialog = ProgressDialog.show(this.context, "Updating the schedule", "Fetching from the server", true);
new ExecuteURLDownload(new UpdateServerListener(dialog)).execute(jsonFile);
} catch (IOException e) {
e.printStackTrace();
}
}
public void processVenues(JSONObject results){
try{
JSONArray shows = results.getJSONArray("Venues");
for(int i = 0; i < shows.length(); i++){
JSONObject jsonVenue = shows.getJSONObject(i).getJSONObject("Venue");
Venue venue = Venue.fromJson(jsonVenue);
venue.insert(DBHelper.getSharedService().getWritableDatabase());
}
}
catch(JSONException je){
je.printStackTrace();
}
}
public void processSchedules(JSONObject results){
SQLiteDatabase db = DBHelper.getSharedService().getWritableDatabase();
try{
JSONArray shows = results.getJSONArray("Schedules");
db.beginTransaction();
for(int i = 0; i < shows.length(); i++){
JSONObject jsonPerf = shows.getJSONObject(i).getJSONObject("Schedule");
Performance perf = Performance.fromJson(jsonPerf);
perf.insert(db);
}
db.setTransactionSuccessful();
}
catch(JSONException je){
je.printStackTrace();
}
finally {
db.endTransaction();
}
}
public void processShows(JSONObject results){
SQLiteDatabase db = DBHelper.getSharedService().getWritableDatabase();
try{
db.beginTransaction();
JSONArray shows = results.getJSONArray("Shows");
for(int i = 0; i < shows.length(); i++){
JSONObject jsonShow = shows.getJSONObject(i).getJSONObject("Show");
Show show = Show.fromJson(jsonShow);
show.insert(DBHelper.getSharedService().getWritableDatabase());
}
db.setTransactionSuccessful();
}
catch(JSONException je){
je.printStackTrace();
}
finally {
db.endTransaction();
}
}
////////
// Get methods
////////
public ArrayList<Show> getShows(String filterString){
//TODO filtering
return Show.getAll(DBHelper.getSharedService().getWritableDatabase(), "sort_name");
}
public Cursor getFavorites(){
Cursor retVal = DBHelper.getSharedService().getWritableDatabase().rawQuery("SELECT p._id, s.name, v.short_name, p.start_date, p.show_id from show s LEFT JOIN performance p on s.id = p.show_id LEFT JOIN venue v on p.venue_id = v.id where favorite = 1 ORDER BY start_date", null);
return retVal;
}
public ArrayList<Venue> getVenues(){
return Venue.getAll(DBHelper.getSharedService().getWritableDatabase(), "id");
}
}