import GLib from "gi://GLib"
import { createPoll } from "ags/time"

function readProc(path: string): string | null {
  try {
    const [ok, contents] = GLib.file_get_contents(path)
    if (ok && contents) return new TextDecoder().decode(contents)
  } catch {}
  return null
}

let prevIdle = 0
let prevTotal = 0

function getCpuUsage(): string {
  const content = readProc("/proc/stat")
  if (!content) return "?"

  const line = content.split("\n")[0]  // "cpu  user nice system idle ..."
  const parts = line.split(/\s+/).slice(1).map(Number)
  const idle = parts[3] + parts[4]  // idle + iowait
  const total = parts.reduce((a, b) => a + b, 0)

  const dIdle = idle - prevIdle
  const dTotal = total - prevTotal
  prevIdle = idle
  prevTotal = total

  if (dTotal === 0) return "0"
  return `${Math.round(((dTotal - dIdle) / dTotal) * 100)}`
}

function getRamUsage(): string {
  const content = readProc("/proc/meminfo")
  if (!content) return "?"

  const lines = content.split("\n")
  let total = 0, available = 0

  for (const line of lines) {
    if (line.startsWith("MemTotal:")) total = parseInt(line.split(/\s+/)[1])
    if (line.startsWith("MemAvailable:")) available = parseInt(line.split(/\s+/)[1])
    if (total && available) break
  }

  if (!total) return "?"
  return `${Math.round(((total - available) / total) * 100)}`
}

export default function SystemStats() {
  const cpu = createPoll("0", 3000, () => getCpuUsage())
  const ram = createPoll("0", 5000, () => getRamUsage())

  return (
    <box>
      <label class="cpu module" label={cpu((v: string) => ` ${v}%`)} />
      <label class="ram module" label={ram((v: string) => `󰍛 ${v}%`)} />
    </box>
  )
}
