package com.vgmlr.kiln
import androidx.room.Entity
import androidx.room.ForeignKey
import androidx.room.Index
import androidx.room.PrimaryKey
enum class KilnButtonKind(val value: Int, val label: String) {
PERIOD(0, "Period"),
NOT_PERIOD(1, "Not-Period");
companion object {
val LABELS: List<String> = entries.map { it.label }
fun of(value: Int): KilnButtonKind = entries.firstOrNull { it.value == value } ?: NOT_PERIOD
fun ofLabel(label: String): KilnButtonKind =
entries.firstOrNull { it.label == label } ?: NOT_PERIOD
}
}
@Entity(
tableName = "button",
foreignKeys = [ForeignKey(
entity = KilnAccount::class,
parentColumns = ["id"],
childColumns = ["accountId"],
onDelete = ForeignKey.CASCADE
)],
indices = [Index("accountId")]
)
data class KilnButton(
@PrimaryKey(autoGenerate = true) val id: Long = 0,
val accountId: Long,
val label: String,
val kind: Int = KilnButtonKind.NOT_PERIOD.value,
val sort: Int = 0
) {
val kindEnum get() = KilnButtonKind.of(kind)
}
object KilnDefaultButtons {
private val SPEC = listOf(
"Tampons" to KilnButtonKind.PERIOD,
"Pads" to KilnButtonKind.PERIOD,
"Liners" to KilnButtonKind.PERIOD,
"Cup" to KilnButtonKind.PERIOD,
"Heating Pad" to KilnButtonKind.PERIOD,
"Bleeding" to KilnButtonKind.PERIOD,
"Cramps" to KilnButtonKind.NOT_PERIOD,
"Bloating" to KilnButtonKind.NOT_PERIOD,
"Cravings" to KilnButtonKind.NOT_PERIOD,
"Irritability" to KilnButtonKind.NOT_PERIOD,
"Fatigue" to KilnButtonKind.NOT_PERIOD,
"Tenderness" to KilnButtonKind.NOT_PERIOD,
"Headache" to KilnButtonKind.NOT_PERIOD
)
fun forAccount(accountId: Long): List<KilnButton> =
SPEC.mapIndexed { i, (label, kind) ->
KilnButton(accountId = accountId, label = label, kind = kind.value, sort = i)
}
}
class KilnButtonSet(buttons: List<KilnButton>) {
private val period = buttons.filter { it.kind == KilnButtonKind.PERIOD.value }
.mapTo(HashSet(), KilnButton::id)
private val notPeriod = buttons.filter { it.kind == KilnButtonKind.NOT_PERIOD.value }
.mapTo(HashSet(), KilnButton::id)
fun isPeriodSighting(record: KilnDayRecord): Boolean = record.checked.any { it in period }
fun symptomCount(record: KilnDayRecord): Int = record.checked.count { it in notPeriod }
fun hasSymptom(record: KilnDayRecord): Boolean = symptomCount(record) > 0
companion object {
val EMPTY = KilnButtonSet(emptyList())
}
}