package com.vorsk.crossfitr.models;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;

/**
 * DAO for "injury" table.
 * 
 * Create a new instance and use the methods to interact with the database.
 * Data is returned as instances of InjuryRow where each column
 * is a publicly accessible property.
 * 
 * @author Vivek
 * @since 1.0
 */
public class InjuryModel extends SQLiteDAO
{
	//// Constants
	
	// Table-specific columns
	public static final String COL_DESC  = "description";
	public static final String COL_BDATE = "date_begin";
	public static final String COL_EDATE = "date_end";
	
	
	/*****   Constructors   *****/
	
	/**
	 * Init SQLiteDAO with table "injury"
	 * 
	 * @param ctx In the example they passed "this" from the calling class..
	 *            I'm not really sure what this is yet.
	 */
	public InjuryModel(Context ctx)
	{
		super("injury", ctx);
	}
	
	/*****   Private   *****/
	
	/**
	 * Utility method to grab all the rows from a cursor
	 * 
	 * @param cr result of a query
	 * @return Array of entries
	 */
	private InjuryRow[] fetchInjuryRows(Cursor cr)
	{
		if (cr == null) {
			return null;
		}
		InjuryRow[] result = new InjuryRow[cr.getCount()];
		if (result.length == 0) {
			cr.close();
			return result;
		}
		
		boolean valid = cr.moveToFirst();
		int ii = 0;
		
		// Grab the cursor's column indices
		// An error here indicates the COL constants aren't synced with the DB
		int ind_id   = cr.getColumnIndexOrThrow(COL_ID);
		int ind_desc = cr.getColumnIndexOrThrow(COL_DESC);
		int ind_bd   = cr.getColumnIndexOrThrow(COL_BDATE);
		int ind_ed   = cr.getColumnIndexOrThrow(COL_EDATE);
		int ind_dm   = cr.getColumnIndexOrThrow(COL_MDATE);
		int ind_dc   = cr.getColumnIndexOrThrow(COL_CDATE);
		
		// Iterate over every row (move the cursor down the set)
		while (valid) {
			result[ii] = new InjuryRow();
			fetchBaseData(cr, result[ii], ind_id, ind_dm, ind_dc);
			result[ii].description = cr.getString(ind_desc);
			result[ii].date_begin  = cr.getInt(ind_bd);
			result[ii].date_end    = cr.getInt(ind_ed);
		
			valid = cr.moveToNext();
			ii ++;
		}

		cr.close();
		return result;
	}
	
	/*****   Public   *****/
	
	/**
	 * Inserts a new entry into the workout table
	 * 
	 * @param row Add this entry to the DB
	 * @return ID of newly added entry, -1 on failure
	 */
	public long insert(InjuryRow row)
	{
		return super.insert(row.toContentValues());
	}
	
	/**
	 * Inserts a new entry into the workout table, defaults record to 0
	 * 
	 * @param description
	 * @param date_begin Date injury started
	 * @param date_end Date injury ended
	 * @return ID of newly added entry, -1 on failure
	 */
	public long insert(String description, int date_begin, int date_end)
	{
		ContentValues cv = new ContentValues();
		cv.put(COL_DESC, description);
		cv.put(COL_BDATE, date_begin);
		cv.put(COL_EDATE, date_end);
		return super.insert(cv);
	}
	
	/**
	 * Fetch an entry via the ID
	 * 
	 * @param id
	 * @return Associated entry or NULL on failure
	 */
	public InjuryRow getByID(long id)
	{
		Cursor cr = selectByID(id);
		
		if (cr.getCount() > 1) {
			return null; // TODO: Throw exception
		}
		
		InjuryRow[] rows = fetchInjuryRows(cr);
		return (rows.length == 0) ? null : rows[0];
	}

}