/**
 * Единые утилиты времени для UI.
 *
 * Контракт API после UTC-перевода:
 * - backend/БД/DTO используют UTC;
 * - API отдаёт ISO-8601 UTC с `Z`;
 * - UI показывает время в часовом поясе браузера;
 * - значения из локальных полей ввода перед отправкой в API конвертируются в UTC ISO.
 *
 * Legacy-строки API без зоны всё ещё могут встретиться при неполностью обновлённых сервисах.
 * В основном UI они обычно приходят из локальных input-полей, поэтому `parseLocal` сохраняет старое
 * поведение: naive-строка разбирается как локальное время браузера. После полного перевода API
 * новые ответы должны приходить с `Z` и будут разобраны как абсолютный UTC-момент.
 */

function pad(n: number): string {
  return String(n).padStart(2, "0");
}

/** Разбирает ISO-строку в эпоху-мс: naive — как локальное время, зонированную — как её момент. */
export function parseLocal(value: string): number {
  return Date.parse(value);
}

/** Дата-время в локальной зоне, формат ru-RU. */
export function formatLocalDateTime(ms: number): string {
  return new Date(ms).toLocaleString("ru-RU", {
    year: "numeric",
    month: "2-digit",
    day: "2-digit",
    hour: "2-digit",
    minute: "2-digit"
  });
}

/** Дата-время с секундами (дд.мм.гггг, чч:мм:сс) — для коротких слотов, где важны секунды. */
export function formatLocalDateTimeSeconds(ms: number): string {
  return new Date(ms).toLocaleString("ru-RU", {
    year: "numeric",
    month: "2-digit",
    day: "2-digit",
    hour: "2-digit",
    minute: "2-digit",
    second: "2-digit"
  });
}

/** Дата (дд.мм) в локальной зоне. */
export function formatLocalDate(ms: number): string {
  return new Date(ms).toLocaleDateString("ru-RU", { day: "2-digit", month: "2-digit" });
}

/** Время (чч:мм) в локальной зоне. */
export function formatLocalTime(ms: number): string {
  return new Date(ms).toLocaleTimeString("ru-RU", { hour: "2-digit", minute: "2-digit" });
}

/** Значение для пикеров (`YYYY-MM-DDTHH:mm`) из локальных компонент. */
export function toLocalInputValue(ms: number): string {
  const d = new Date(ms);
  return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}`;
}

/**
 * Локальная ISO-строка без зоны (`YYYY-MM-DDTHH:mm:ss`) из локальных компонент.
 * Оставлена для локальных UI-расчётов и полей времени, не использовать для отправки API DTO.
 */
export function toLocalIso(ms: number): string {
  const d = new Date(ms);
  return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;
}

/** UTC ISO-строка для DTO/query-параметров API. */
export function toUtcIso(ms: number): string {
  return new Date(ms).toISOString();
}
