package ru.fincode.tsudesk.feature.schedule.presentation.util

import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Locale

private const val API_PATTERN = "dd.MM.yyyy"

/**
 * Возвращает сегодняшнюю дату в формате dd.MM.yyyy
 */
fun todayString(): String {
    val sdf = SimpleDateFormat(API_PATTERN, Locale.getDefault())
    return sdf.format(Calendar.getInstance().time)
}

/**
 * Строит список дат (Пн–Сб) для недели,
 * к которой принадлежит anchor.
 */
fun buildDayStrip(anchor: String): List<String> {
    val sdf = SimpleDateFormat(API_PATTERN, Locale.getDefault())
    val cal = Calendar.getInstance()

    val parsed = runCatching { sdf.parse(anchor) }.getOrNull()
        ?: return emptyList()

    cal.time = parsed

    // Сдвигаем к понедельнику
    while (cal.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
        cal.add(Calendar.DAY_OF_MONTH, -1)
    }

    return (0..5).map {
        val out = sdf.format(cal.time)
        cal.add(Calendar.DAY_OF_MONTH, 1)
        out
    }
}

/**
 * Короткий день недели по строке dd.MM.yyyy
 * Пример: "12.01.2026" -> "Пн"
 */
fun dowRuShort(date: String): String {
    val sdf = SimpleDateFormat(API_PATTERN, Locale.getDefault())
    val parsed = runCatching { sdf.parse(date) }.getOrNull()
        ?: return "Дн"

    val cal = Calendar.getInstance().apply { time = parsed }

    return when (cal.get(Calendar.DAY_OF_WEEK)) {
        Calendar.MONDAY -> "Пн"
        Calendar.TUESDAY -> "Вт"
        Calendar.WEDNESDAY -> "Ср"
        Calendar.THURSDAY -> "Чт"
        Calendar.FRIDAY -> "Пт"
        Calendar.SATURDAY -> "Сб"
        Calendar.SUNDAY -> "Вс"
        else -> "Дн"
    }
}

/**
 * Проверяет, является ли переданная дата сегодняшней.
 */
fun isToday(date: String): Boolean {
    return date == todayString()
}

/**
 * Преобразует строку времени "HH:mm" в минуты от начала суток.
 * Возвращает null если формат некорректный.
 */
fun hmToMinutes(hm: String): Int? {
    val parts = hm.split(":")
    if (parts.size != 2) return null

    val h = parts[0].toIntOrNull() ?: return null
    val m = parts[1].toIntOrNull() ?: return null

    if (h !in 0..23 || m !in 0..59) return null
    return h * 60 + m
}

/**
 * Преобразует диапазон времени "08:30 - 10:00"
 * или "08:30 — 10:00" в пару минут (start, end).
 */
fun parseTimeRangeToMinutes(range: String): Pair<Int, Int>? {
    val normalized = range
        .replace("-", "—")
        .replace("–", "—")

    val parts = normalized.split("—").map { it.trim() }
    if (parts.size != 2) return null

    val start = hmToMinutes(parts[0]) ?: return null
    val end = hmToMinutes(parts[1]) ?: return null

    return start to end
}