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 -> "(man–fre)" 0x41 -> "(lør–sø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" } }