package fi.bitrite.android.ws.persistence.impl;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import fi.bitrite.android.ws.model.Feedback;
import fi.bitrite.android.ws.model.Host;
import fi.bitrite.android.ws.model.HostBriefInfo;
import fi.bitrite.android.ws.persistence.StarredHostDao;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class StarredHostDaoImpl implements StarredHostDao {
private SQLiteDatabase database;
private DbHelper dbHelper;
public void open() throws SQLException {
if (dbHelper == null) {
dbHelper = new DbHelper();
}
database = dbHelper.getWritableDatabase();
}
public void close() {
if (database != null && database.isOpen()) {
database.close();
}
}
public void insert(int id, String name, Host host, List<Feedback> feedback) {
ContentValues values = new ContentValues();
values.put(DbHelper.COLUMN_ID, id);
values.put(DbHelper.COLUMN_NAME, name);
values.put(DbHelper.COLUMN_UPDATED, System.currentTimeMillis() / 1000L); // As expected to be used later
Gson gson = new Gson();
String details = gson.toJson(host);
values.put(DbHelper.COLUMN_DETAILS, details);
String feedbackJson = gson.toJson(feedback);
values.put(DbHelper.COLUMN_FEEDBACK, feedbackJson);
database.insert(DbHelper.TABLE_HOSTS, null, values);
}
public Host getHost(int id) {
Cursor cursor;
if (id > 0) {
cursor = database.query(DbHelper.TABLE_HOSTS, new String[]{DbHelper.COLUMN_ID, DbHelper.COLUMN_DETAILS,
DbHelper.COLUMN_UPDATED}, DbHelper.COLUMN_ID + " = " + id, null, null, null, null);
} else {
cursor = database.query(DbHelper.TABLE_HOSTS, new String[]{DbHelper.COLUMN_NAME, DbHelper.COLUMN_DETAILS,
DbHelper.COLUMN_UPDATED}, DbHelper.COLUMN_NAME + " = '" + id + "'", null, null, null, null);
}
if (cursor.getCount() == 0) {
cursor.close();
return null;
}
cursor.moveToFirst();
Host host = cursorToHost(cursor);
cursor.close();
return host;
}
private Host cursorToHost(Cursor cursor) {
String json = cursor.getString(1);
Gson gson = new Gson();
try {
Host host = gson.fromJson(json, Host.class);
host.setUpdated(cursor.getLong(cursor.getColumnIndex(DbHelper.COLUMN_UPDATED)));
return host;
} catch (Exception e) {
throw new PersistenceException("Could not load starred host details");
}
}
public ArrayList<Feedback> getFeedback(int id, String name) {
Cursor cursor;
if (id > 0) {
cursor = database.query(DbHelper.TABLE_HOSTS, new String[]{DbHelper.COLUMN_FEEDBACK},
DbHelper.COLUMN_ID + " = " + id, null, null, null, null);
} else {
cursor = database.query(DbHelper.TABLE_HOSTS, new String[]{DbHelper.COLUMN_FEEDBACK},
DbHelper.COLUMN_NAME + " = '" + name + "'", null, null, null, null);
}
if (cursor.getCount() == 0) {
cursor.close();
return null;
}
cursor.moveToFirst();
ArrayList<Feedback> feedback = cursorToFeedback(cursor);
cursor.close();
return feedback;
}
private ArrayList<Feedback> cursorToFeedback(Cursor cursor) {
String json = cursor.getString(0);
Gson gson = new Gson();
try {
Type listType = new TypeToken<List<Feedback>>() {
}.getType();
ArrayList<Feedback> feedback = gson.fromJson(json, listType);
return feedback;
} catch (Exception e) {
throw new PersistenceException("Could not load host feedback");
}
}
public List<HostBriefInfo> getAllBrief() {
Cursor cursor = database.query(DbHelper.TABLE_HOSTS, new String[]{DbHelper.COLUMN_ID,
DbHelper.COLUMN_DETAILS, DbHelper.COLUMN_UPDATED}, null, null, null, null, null);
if (cursor.getCount() == 0) {
cursor.close();
return Collections.emptyList();
}
List<HostBriefInfo> hosts = new ArrayList<HostBriefInfo>();
while (!cursor.isLast()) {
cursor.moveToNext();
Host host = cursorToHost(cursor);
hosts.add(new HostBriefInfo(cursor.getInt(0), host));
}
cursor.close();
return hosts;
}
public void delete(int id, String name) {
if (id > 0) {
database.delete(DbHelper.TABLE_HOSTS, DbHelper.COLUMN_ID + " = " + id, null);
} else {
database.delete(DbHelper.TABLE_HOSTS, DbHelper.COLUMN_NAME + " = '" + name + "'", null);
}
}
public void update(int id, String name, Host host, List<Feedback> feedback) {
delete(id, name);
insert(id, name, host, feedback);
}
public boolean isHostStarred(int id) {
return (getHost(id) != null);
}
}