(() => {
  let durationOnPause = "---";
  let redrawInterval: IntervalId | undefined;
  let startTime: number | undefined;
  let showMillis = true;
  const milliTime = 60;

  const unqueueRedraw = () => {
    if (redrawInterval) clearInterval(redrawInterval);
    redrawInterval = undefined;
  };

  const queueRedraw = function(this: ClockInfo.MenuItem) {
    unqueueRedraw();
    redrawInterval = setInterval(() => {
        if (startTime) {
            if (showMillis && Date.now() - startTime > milliTime * 1000) {
                showMillis = false;
                changeInterval(redrawInterval!, 1000);
            }
        } else {
            unqueueRedraw();
        }
        this.emit('redraw')
    }, 100);
  };

  const pad2 = (s: number) => ('0' + s.toFixed(0)).slice(-2);

  const duration = (start: number) => {
    let seconds = (Date.now() - start) / 1000;

    if (seconds < milliTime)
      return seconds.toFixed(1);

    let mins = seconds / 60;
    seconds %= 60;

    if (mins < 60)
      return `${mins.toFixed(0)}:${pad2(seconds)}`;

    let hours = mins / 60;
    mins %= 60;

    return `${hours.toFixed(0)}:${pad2(mins)}:${pad2(seconds)}`;
  };

  const img = () => atob("GBiBAAAAAAB+AAB+AAAAAAB+AAH/sAOB8AcA4A4YcAwYMBgYGBgYGBg8GBg8GBgYGBgAGAwAMA4AcAcA4AOBwAH/gAB+AAAAAAAAAA==");

  return {
    name: "timer",
    img: img(),
    items: [
      {
        name: "stopw",
        get: () => ({
          text: startTime
            ? duration(startTime)
            : durationOnPause,
          img: img(),
        }),
        show: function(this: ClockInfo.MenuItem) {
          if(startTime){ // only queue if active
            queueRedraw.call(this);
          }else{
            this.emit('redraw')
          }
        },
        hide: unqueueRedraw,
        run: function() { // tapped
          if (startTime) {
            durationOnPause = duration(startTime);
            startTime = undefined; // this also unqueues the redraw
          } else {
            queueRedraw.call(this);
            showMillis = true;
            startTime = Date.now();
          }
        }
      }
    ]
  };
}) satisfies ClockInfoFunc
