/**
 * @module modules/uniform-time-sk
 * @description <h2><code>uniform-time-sk</code></h2>
 *
 * Constructs a handler for the iTime uniform.
 *
 * Displays the play/pause and rewind buttons.
 */
import { define } from 'elements-sk/define';
import { html } from 'lit-html';
import { ElementSk } from '../ElementSk';
import 'elements-sk/icon/play-arrow-icon-sk';
import 'elements-sk/icon/pause-icon-sk';
import 'elements-sk/icon/fast-rewind-icon-sk';
import { Uniform, UniformControl } from '../uniform/uniform';
import 'elements-sk/styles/buttons';

const defaultUniform: Uniform = {
  name: 'iTime',
  rows: 1,
  columns: 1,
  slot: 0,
};

// The type of Date.now.
type DateNow = ()=> number;

export class UniformTimeSk extends ElementSk implements UniformControl {
  private startTime: number = 0; // The time as recorded from this._dateNow in ms.

  private pauseTime: number = 0; // The time we were at when pause was pressed, in seconds.

  private _uniform: Uniform = defaultUniform;

  private _dateNow: DateNow = Date.now; // A replaceable Date.now() function for testing.

  private playing: boolean = true;

  constructor() {
    super(UniformTimeSk.template);
  }

  private static template = (ele: UniformTimeSk) => html`
  <button id="restart" @click=${ele.restart}>
    <fast-rewind-icon-sk></fast-rewind-icon-sk>
  </button>
  <button id="playpause" @click=${ele.togglePlaying}>
    <play-arrow-icon-sk ?hidden=${ele.playing}></play-arrow-icon-sk>
    <pause-icon-sk ?hidden=${!ele.playing}></pause-icon-sk>
  </button>
  <span id=ms>${ele.time.toFixed(3)}</span>
  <span>${ele._uniform.name}</span>
`;

  connectedCallback(): void {
    super.connectedCallback();
    this._render();
    this.startTime = this.dateNow();
    this.time = 0;
  }

  render(): void {
    this._render();
  }

  /** Copies the values of the control into the uniforms array. */
  applyUniformValues(uniforms: number[]): void {
    uniforms[this._uniform.slot] = this.time;
  }

  // eslint-disable-next-line @typescript-eslint/no-unused-vars
  restoreUniformValues(uniforms: number[]): void {
    // This is a noop, we don't restore predefined uniform values.
  }

  onRAF(): void {
    this.render();
  }

  needsRAF(): boolean {
    return true;
  }

  /** Allows overriding the Date.now function for testing. */
  get dateNow(): DateNow {
    return this._dateNow;
  }

  set dateNow(val: DateNow) {
    this._dateNow = val;
  }

  /** The current time offset in seconds. */
  get time(): number {
    if (!this.playing) {
      return this.pauseTime;
    }
    return (this.dateNow() - this.startTime) / 1000;
  }

  set time(val: number) {
    this.pauseTime = val;
    this.startTime = this.dateNow() - val * 1000;
  }

  /** The description of the uniform. */
  get uniform(): Uniform {
    return this._uniform;
  }

  set uniform(val: Uniform) {
    if (val.rows !== 1 || val.columns !== 1) {
      throw new Error('Invalid time uniform dimensions.');
    }
    this._uniform = val;
    this._render();
  }

  private restart() {
    this.time = 0;
    this.pauseTime = 0;
    this._render();
  }

  private togglePlaying() {
    if (this.playing) {
      this.pauseTime = this.time;
    } else {
      this.time = this.pauseTime;
    }
    this.playing = !this.playing;
    this._render();
  }
}

define('uniform-time-sk', UniformTimeSk);
