med-det-samme/app/src/main/java/no/naiv/meddetsamme/domain/ScheduleText.kt

51 lines
1.8 KiB
Kotlin
Raw Normal View History

package no.naiv.meddetsamme.domain
import no.naiv.meddetsamme.data.DoseTime
/**
* Human-readable schedule descriptions (Norwegian, 24h) for the doctor
* summary and the UI. Pure unit-tested like the engine, since a wrong
* description on a doctor's desk is a clinical communication error.
*/
object ScheduleText {
/** Mask bit order matches ScheduleEngine: bit 0 = Sunday. */
private val DAY_ABBREV = listOf("søn", "man", "tir", "ons", "tor", "fre", "lør")
fun describe(doseTime: DoseTime): String {
val time = "%02d:%02d".format(doseTime.minuteOfDay / 60, doseTime.minuteOfDay % 60)
return "$time ${daysText(doseTime)}"
}
fun daysText(doseTime: DoseTime): String {
if (doseTime.intervalDays > 1) {
return "(hver ${doseTime.intervalDays}. dag)"
}
return when (val mask = doseTime.daysOfWeekMask and 0x7F) {
0x7F -> "(daglig)"
0x3E -> "(manfre)"
0x41 -> "(lørsøn)"
0 -> "(aldri)"
else -> {
// Week listed Monday-first for humans, despite bit 0 = Sunday.
val days = (1..7).map { it % 7 }
.filter { mask and (1 shl it) != 0 }
.map { DAY_ABBREV[it] }
"(${days.joinToString(", ")})"
}
}
}
/** "1 dag", "3 dager" — norsk flertall. */
fun daysCount(days: Int): String = if (days == 1) "1 dag" else "$days dager"
/** "1 tablett", "2,5 ml" — norsk desimalkomma. */
fun amountText(amount: Double, unit: String): String {
val number = if (amount == amount.toLong().toDouble()) {
amount.toLong().toString()
} else {
amount.toString().replace('.', ',')
}
return "$number $unit"
}
}