package com.cpiekarski.fourteeners.register;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.cpiekarski.fourteeners.utils.Mountain;
import com.cpiekarski.fourteeners.utils.Mountains;
import com.cpiekarski.fourteeners.utils.SRLOG;
/**
* CRUD model for a register entry
*/
public class RegisterEntry {
public final int NO_VALUE = -1;
private final String TAG = "RegisterEntry";
private Context mCtx;
private Mountain mMountain;
private String mStartTime;
private String mEndTime;
private String mDistance;
private int mStartElevation = NO_VALUE;
private int mEndElevation = NO_VALUE;
private int mPeekElevation = NO_VALUE;
private int mSummit = NO_VALUE;
private double mStartLatLoc = NO_VALUE;
private double mStartLongLoc = NO_VALUE;
private double mEndLatLoc = NO_VALUE;
private double mEndLongLoc = NO_VALUE;
private int mEndLocAccuracy = NO_VALUE;
private int mStartLocAccuracy = NO_VALUE;
private String mNotes;
private long mRowId;
private String mProof;
public RegisterEntry(Context context) {
mCtx = context;
}
public RegisterEntry(Context context, int entryId) {
mCtx = context;
readEntry(entryId);
}
private String getStartLocationTuple() {
return String.valueOf(mStartLatLoc) + ";" + String.valueOf(mStartLongLoc) + ";" +
String.valueOf(mStartLocAccuracy);
}
private String getEndLocationTuple() {
return String.valueOf(mEndLatLoc) + ";" + String.valueOf(mEndLongLoc) + ";" +
String.valueOf(mEndLocAccuracy);
}
private void parseStartLocationTuple(String tuple) {
String[] x = tuple.split(";");
mStartLatLoc = Double.parseDouble(x[0]);
mStartLongLoc = Double.parseDouble(x[1]);
mStartLocAccuracy = Integer.parseInt(x[2]);
}
private void parseEndLocationTuple(String tuple) {
String[] x = tuple.split(";");
mEndLatLoc = Double.parseDouble(x[0]);
mEndLongLoc = Double.parseDouble(x[1]);
mEndLocAccuracy = Integer.parseInt(x[2]);
}
/**
*
* @return false if failure, true otherwise
*/
public boolean createEntry() {
if(mMountain == null) {
SRLOG.w(TAG, "No mountain set for entry; entry not created.");
return false;
}
// } else if(mStartLatLoc == null) {
// SRLOG.w(TAG, "No start location set for entry; entry not created.");
// return false;
// }
RegisterHelper r = new RegisterHelper(mCtx);
SQLiteDatabase d = r.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(RegisterHelper.MNT_NAME, getMountainName());
values.put(RegisterHelper.MNT_RANGE, getMountainRange());
values.put(RegisterHelper.START_ELEVATION, mStartElevation);
values.put(RegisterHelper.START_TIME, mStartTime);
values.put(RegisterHelper.START_LOC, getStartLocationTuple());
values.put(RegisterHelper.END_ELEVATION, mEndElevation);
values.put(RegisterHelper.END_TIME, mEndTime);
values.put(RegisterHelper.END_LOC, getEndLocationTuple());
values.put(RegisterHelper.PEEK_ELEVATION, mPeekElevation);
values.put(RegisterHelper.DISTANCE, mDistance);
values.put(RegisterHelper.NOTES, mNotes);
values.put(RegisterHelper.PROOF, mProof);
values.put(RegisterHelper.SUMMIT, mSummit);
mRowId = d.insert(RegisterHelper.TABLE_NAME, null, values);
if(mRowId == -1) {
SRLOG.e(TAG, "Failed to insert new entry; rowId = -1.");
} else {
SRLOG.d(TAG, "Register entry created; rowId = " + mRowId);
}
return mRowId == -1 ? false : true;
}
public boolean readEntry(int e) {
boolean result = true;
RegisterHelper r = new RegisterHelper(mCtx);
SQLiteDatabase d = r.getReadableDatabase();
Cursor c = d.query(RegisterHelper.TABLE_NAME, null,"_id = " + e,
null, null, null, null);
if(c.getCount() > 0) {
if(c.moveToNext()) {
mRowId = c.getLong(c.getColumnIndex("_id"));
int i = c.getColumnIndex(RegisterHelper.NOTES);
mNotes = c.getString(i);
i = c.getColumnIndex(RegisterHelper.DISTANCE);
mDistance = c.getString(i);
i = c.getColumnIndex(RegisterHelper.START_LOC);
parseStartLocationTuple(c.getString(i));
i = c.getColumnIndex(RegisterHelper.END_LOC);
parseEndLocationTuple(c.getString(i));
i = c.getColumnIndex(RegisterHelper.MNT_NAME);
String name = c.getString(i);
i = c.getColumnIndex(RegisterHelper.MNT_RANGE);
String range = c.getString(i);
mMountain = Mountains.getInstance(mCtx).getMountain(name, range);
}
} else {
SRLOG.w(TAG, "No row found for entry number "+e);
result = false;
}
c.close();
return result;
}
public boolean updateEntry() {
RegisterHelper r = new RegisterHelper(mCtx);
SQLiteDatabase d = r.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(RegisterHelper.MNT_NAME, getMountainName());
values.put(RegisterHelper.MNT_RANGE, getMountainRange());
values.put(RegisterHelper.START_ELEVATION, mStartElevation);
values.put(RegisterHelper.START_TIME, mStartTime);
values.put(RegisterHelper.START_LOC, getStartLocationTuple());
values.put(RegisterHelper.END_ELEVATION, mEndElevation);
values.put(RegisterHelper.END_TIME, mEndTime);
values.put(RegisterHelper.END_LOC, getEndLocationTuple());
values.put(RegisterHelper.PEEK_ELEVATION, mPeekElevation);
values.put(RegisterHelper.DISTANCE, mDistance);
values.put(RegisterHelper.NOTES, mNotes);
values.put(RegisterHelper.PROOF, mProof);
values.put(RegisterHelper.SUMMIT, mSummit);
int x = d.update(RegisterHelper.TABLE_NAME, values, "_id = " + mRowId, null);
if(x == 0) {
SRLOG.e(TAG, "Failed to update entry; updated 0 rows.");
} else {
SRLOG.d(TAG, "Register entry updated; rowId = " + mRowId);
}
return mRowId == -1 ? false : true;
}
public boolean deleteEntry() {
RegisterHelper r = new RegisterHelper(mCtx);
SQLiteDatabase d = r.getWritableDatabase();
int x = d.delete(RegisterHelper.TABLE_NAME, "_id = " + mRowId, null);
return x == 0 ? false : true;
}
public String getMountainName() {
return mMountain.getName();
}
public String getMountainRange() {
return mMountain.getRange();
}
/**
* Entries can be added for failed summit attempts. If the summit was reached
* pass a true to this method.
* @param summit
*/
public void setReachedSummit(boolean summit) {
mSummit = summit ? 1 : 0;
}
public void setProof(String proof) {
mProof = proof;
}
public void setNotes(String notes) {
mNotes = notes;
}
public void setMountain(Mountain mnt) {
mMountain = mnt;
}
public void setStartLoc(double lat, double lon, int accuracy) {
mStartLatLoc = lat;
mStartLongLoc = lon;
mStartLocAccuracy = accuracy;
}
public void setEndLoc(double lat, double lon, int accuracy) {
mEndLatLoc = lat;
mEndLongLoc = lon;
mEndLocAccuracy = accuracy;
}
public void setStartElevation(int elev) {
mStartElevation = elev;
}
public void setEndElevation(int elev) {
mEndElevation = elev;
}
public void setPeekElevation(int elev) {
mPeekElevation = elev;
}
public void setStartTime(String time) {
mStartTime = time;
}
public void setEndTime(String time) {
mEndTime = time;
}
public void setDistance(String distance) {
mDistance = distance;
}
@Override
public String toString() {
return "";
}
}