package it.danieleverducci.lunatracker.entities import android.content.Context import it.danieleverducci.lunatracker.R import org.json.JSONObject import java.util.Date /** * Represents a logged event. * It encloses, but doesn't parse entirely, a jsonObject. This was done to * allow expandability and backwards compatibility (if a field is added in a * release, it is simply ignored by previous ones). */ class LunaEvent { companion object { val TYPE_BABY_BOTTLE = "BABY_BOTTLE" val TYPE_WEIGHT = "WEIGHT" val TYPE_BREASTFEEDING_LEFT_NIPPLE = "BREASTFEEDING_LEFT_NIPPLE" val TYPE_BREASTFEEDING_BOTH_NIPPLE = "BREASTFEEDING_BOTH_NIPPLE" val TYPE_BREASTFEEDING_RIGHT_NIPPLE = "BREASTFEEDING_RIGHT_NIPPLE" val TYPE_DIAPERCHANGE_POO = "DIAPERCHANGE_POO" val TYPE_DIAPERCHANGE_PEE = "DIAPERCHANGE_PEE" val TYPE_MEDICINE = "MEDICINE" val TYPE_ENEMA = "ENEMA" val TYPE_NOTE = "NOTE" val TYPE_CUSTOM = "CUSTOM" val TYPE_COLIC = "COLIC" val TYPE_TEMPERATURE = "TEMPERATURE" } private val jo: JSONObject var time: Long // In unix time (seconds since 1970) get() = jo.getLong("time") set(value) { jo.put("time", value) } var type: String get(): String = jo.getString("type") set(value) { jo.put("type", value) } var quantity: Int get() = jo.optInt("quantity") set(value) { if (value > 0) jo.put("quantity", value) } var notes: String get(): String = jo.optString("notes") set(value) { jo.put("notes", value) } constructor(jo: JSONObject) { this.jo = jo // A minimal LunaEvent should have at least time and type if (!jo.has("time") || !jo.has("type")) throw IllegalArgumentException("JSONObject is not a LunaEvent") } constructor(type: String) { this.jo = JSONObject() this.time = System.currentTimeMillis() / 1000 this.type = type } constructor(type: String, quantity: Int) { this.jo = JSONObject() this.time = System.currentTimeMillis() / 1000 this.type = type this.quantity = quantity } fun getTypeEmoji(context: Context): String { return context.getString( when (type) { TYPE_BABY_BOTTLE -> R.string.event_bottle_type TYPE_WEIGHT -> R.string.event_scale_type TYPE_BREASTFEEDING_LEFT_NIPPLE -> R.string.event_breastfeeding_left_type TYPE_BREASTFEEDING_BOTH_NIPPLE -> R.string.event_breastfeeding_both_type TYPE_BREASTFEEDING_RIGHT_NIPPLE -> R.string.event_breastfeeding_right_type TYPE_DIAPERCHANGE_POO -> R.string.event_diaperchange_poo_type TYPE_DIAPERCHANGE_PEE -> R.string.event_diaperchange_pee_type TYPE_MEDICINE -> R.string.event_medicine_type TYPE_ENEMA -> R.string.event_enema_type TYPE_NOTE -> R.string.event_note_type TYPE_TEMPERATURE -> R.string.event_temperature_type TYPE_COLIC -> R.string.event_colic_type else -> R.string.event_unknown_type } ) } fun getTypeDescription(context: Context): String { return context.getString( when (type) { TYPE_BABY_BOTTLE -> R.string.event_bottle_desc TYPE_WEIGHT -> R.string.event_scale_desc TYPE_BREASTFEEDING_LEFT_NIPPLE -> R.string.event_breastfeeding_left_desc TYPE_BREASTFEEDING_BOTH_NIPPLE -> R.string.event_breastfeeding_both_desc TYPE_BREASTFEEDING_RIGHT_NIPPLE -> R.string.event_breastfeeding_right_desc TYPE_DIAPERCHANGE_POO -> R.string.event_diaperchange_poo_desc TYPE_DIAPERCHANGE_PEE -> R.string.event_diaperchange_pee_desc TYPE_MEDICINE -> R.string.event_medicine_desc TYPE_ENEMA -> R.string.event_enema_desc TYPE_NOTE -> R.string.event_note_desc TYPE_TEMPERATURE -> R.string.event_temperature_desc TYPE_COLIC -> R.string.event_colic_desc else -> R.string.event_unknown_desc } ) } fun toJson(): JSONObject { return jo } override fun toString(): String { return "${type} qty: $quantity time: ${Date(time * 1000)}" } }