#!/bin/bash

set -euo pipefail

repo_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/../.." && pwd)"
model="$repo_dir/config/dot/quickshell/modules/osd/OsdModel.js"

node - "$model" <<'JS'
const assert = require('node:assert/strict')
const model = require(process.argv[2])

assert.equal(model.iconFor('volume', 0), 'audio-volume-muted-symbolic')
assert.equal(model.iconFor('volume', 0.2), 'audio-volume-low-symbolic')
assert.equal(model.iconFor('volume', 0.5), 'audio-volume-medium-symbolic')
assert.equal(model.iconFor('volume', 0.9), 'audio-volume-high-symbolic')
assert.equal(model.iconFor('microphone-muted', 0.7), 'microphone-sensitivity-muted-symbolic')
assert.equal(model.iconFor('brightness', 0.4), 'display-brightness-symbolic')

// The magnifier's OSD, posted by Accessibility.stepZoom when a zoom keybind is
// pressed. An unmapped kind falls through iconFor to the kind's own name, and
// "zoom" is not an icon -- the OSD would draw the generic fallback glyph for
// the one shortcut whose whole job is telling somebody who cannot read the
// screen what the magnification now is.
// An empty bar is 1.00 ×, which is off rather than "barely magnified", so it
// gets the reset icon: the zoom-in glyph beside an empty bar would read as a
// magnifier that had stopped working.
assert.equal(model.iconFor('zoom', 0.4), 'zoom-in-symbolic')
assert.equal(model.iconFor('zoom', 0), 'zoom-original-symbolic')

assert.deepEqual(
  model.progressState('volume', 140, 100, '', 900),
  {
    kind: 'volume',
    value: 100,
    maximum: 100,
    ratio: 1,
    label: '100%',
    icon: 'audio-volume-high-symbolic',
    duration: 900,
    progress: true
  }
)

assert.deepEqual(
  model.progressState('volume-muted', 43, 100, 'Muted', -50),
  {
    kind: 'volume-muted',
    value: 43,
    maximum: 100,
    ratio: 0.43,
    label: 'Muted',
    icon: 'audio-volume-muted-symbolic',
    duration: 0,
    progress: true
  }
)

assert.deepEqual(
  model.messageState('media-next', 'Glass Beams', 'invalid'),
  {
    kind: 'media-next',
    value: 0,
    maximum: 100,
    ratio: 0,
    label: 'Glass Beams',
    icon: 'media-skip-forward-symbolic',
    duration: 1400,
    progress: false
  }
)

console.log('osd model contract: PASS')
JS
