pragma Singleton

import Quickshell
import QtQuick
import qs.Commons
import qs.Services

Singleton {
  id: root

  property var date: new Date()

  // Returns a Unix Timestamp (in seconds)
  readonly property int timestamp: {
    return Math.floor(date / 1000)
  }

  function formatDate(monthBeforeDay = true) {
    let now = date
    let dayName = now.toLocaleDateString(Qt.locale(), "ddd")
    dayName = dayName.charAt(0).toUpperCase() + dayName.slice(1)
    let day = now.getDate()
    let suffix
    if (day > 3 && day < 21)
      suffix = 'th'
    else
      switch (day % 10) {
      case 1:
        suffix = "st"
        break
      case 2:
        suffix = "nd"
        break
      case 3:
        suffix = "rd"
        break
      default:
        suffix = "th"
      }
    let month = now.toLocaleDateString(Qt.locale(), "MMMM")
    let year = now.toLocaleDateString(Qt.locale(), "yyyy")

    return `${dayName}, ` + (monthBeforeDay ? `${month} ${day}${suffix} ${year}` : `${day}${suffix} ${month} ${year}`)
  }


  /**
 * Formats a Date object into a YYYYMMDD-HHMMSS string.
 * @param {Date} [date=new Date()] - The date to format. Defaults to the current date and time.
 * @returns {string} The formatted date string.
 */
  function getFormattedTimestamp(date = new Date()) {
  const year = date.getFullYear()

  // getMonth() is zero-based, so we add 1
  const month = String(date.getMonth() + 1).padStart(2, '0')
  const day = String(date.getDate()).padStart(2, '0')

  const hours = String(date.getHours()).padStart(2, '0')
  const minutes = String(date.getMinutes()).padStart(2, '0')
  const seconds = String(date.getSeconds()).padStart(2, '0')

  return `${year}${month}${day}-${hours}${minutes}${seconds}`
}

// Format an easy to read approximate duration ex: 4h32m
// Used to display the time remaining on the Battery widget, computer uptime, etc..
function formatVagueHumanReadableDuration(totalSeconds) {
  if (typeof totalSeconds !== 'number' || totalSeconds < 0) {
    return '0s'
  }

  // Floor the input to handle decimal seconds
  totalSeconds = Math.floor(totalSeconds)

  const days = Math.floor(totalSeconds / 86400)
  const hours = Math.floor((totalSeconds % 86400) / 3600)
  const minutes = Math.floor((totalSeconds % 3600) / 60)
  const seconds = totalSeconds % 60

  const parts = []
  if (days)
    parts.push(`${days}d`)
  if (hours)
    parts.push(`${hours}h`)
  if (minutes)
    parts.push(`${minutes}m`)

  // Only show seconds if no hours and no minutes
  if (!hours && !minutes) {
    parts.push(`${seconds}s`)
  }

  return parts.join('')
}

Timer {
  interval: 1000
  repeat: true
  running: true

  onTriggered: root.date = new Date()
}
}
