"use strict";

const HTMLElementImpl = require("./HTMLElement-impl").implementation;
const { getLabelsForLabelable } = require("../helpers/form-controls");
const { parseFloatingPointNumber } = require("../helpers/strings");

class HTMLProgressElementImpl extends HTMLElementImpl {
  constructor(args, privateData) {
    super(args, privateData);
    this._labels = null;
  }

  get value() {
    const parsedValue = parseFloatingPointNumber(this.getAttributeNS(null, "value"));

    if (!isNaN(parsedValue) && parsedValue > 0) {
      return parsedValue > this.max ? this.max : parsedValue;
    }

    return 0;
  }
  set value(value) {
    this.setAttributeNS(null, "value", value);
  }

  get max() {
    const parsedMax = parseFloatingPointNumber(this.getAttributeNS(null, "max"));

    if (!isNaN(parsedMax) && parsedMax > 0) {
      return parsedMax;
    }

    return 1.0;
  }
  set max(value) {
    this.setAttributeNS(null, "max", value);
  }

  get position() {
    if (!this.hasAttributeNS(null, "value")) {
      return -1;
    }

    return this.value / this.max;
  }

  get labels() {
    return getLabelsForLabelable(this);
  }
}

module.exports = {
  implementation: HTMLProgressElementImpl
};