import {define} from '/node_modules/vl-ui-core/dist/vl-core.js';
import {VlMapLayerStyle} from '/src/vl-map-layer-style.js';
import {
  OlStyle,
  OlStyleCircle,
  OlStyleStroke,
  OlStyleFill,
} from '/node_modules/vl-mapactions/dist/vl-mapactions.js';

/**
 * VlMapLayerCircleStyle
 * @class
 * @classdesc De kaart laag style klasse voor cirkels.
 *
 * @extends VlMapLayerStyle
 *
 * @property {number} data-vl-size - Attribuut wordt gebruikt om aan te geven wat de grootte is van de cirkels.
 * @property {string} data-vl-border-color - Attribuut wordt gebruikt om aan te geven wat de color is van de randen van de cirkels.
 * @property {number} data-vl-border-size - Attribuut wordt gebruikt om aan te geven wat de grootte is van de randen van de cirkels.
 * @property {string} data-vl-cluster-text-color - Attribuut wordt gebruikt om aan te geven wat de kleur van de tekst is bij het clusteren van features.
 * @property {string} data-vl-cluster-color - Attribuut wordt gebruikt om aan te geven wat de kleur is bij het clusteren van features.
 *
 * @see {@link https://www.github.com/milieuinfo/webcomponent-vl-ui-map/releases/latest|Release notes}
 * @see {@link https://www.github.com/milieuinfo/webcomponent-vl-ui-map/issues|Issues}
 * @see {@link https://webcomponenten.omgeving.vlaanderen.be/demo/vl-map-circle-style.html|Demo}
 */
export class VlMapLayerCircleStyle extends VlMapLayerStyle {
  /**
   * Geeft de grootte van de cirkels terug.
   *
   * @Return {number}
   */
  get size() {
    return this.getAttribute('size') || 5;
  }

  /**
   * Geeft de randkleur van de cirkels terug.
   *
   * @Return {string}
   */
  get borderColor() {
    return this.getAttribute('border-color') || 'rgba(0, 0, 0, 0)';
  }

  /**
   * Geeft de size van de rand van de cirkels terug.
   *
   * @Return {number}
   */
  get borderSize() {
    return this.getAttribute('border-size') || 1;
  }

  /**
   * Geeft de kleur van de tekst bij het clusteren van features terug.
   *
   * @Return {string}
   */
  get clusterTextColor() {
    return this.getAttribute('cluster-text-color') || '#FFF';
  }

  /**
   * Geeft de kleur bij het clusteren van features terug.
   *
   * @Return {string}
   */
  get clusterColor() {
    return this.getAttribute('cluster-color') || 'rgba(2, 85, 204, 1)';
  }

  get _styleFunction() {
    return (feature, resolution) => {
      const features = feature && feature.get ? (feature.get('features') || []) : [];
      const size = features.length || 1;
      const clusterMultiplier = size == 1 ? 1 : Math.max(1.5, size.toString().length);
      let textColor = this.textColor;
      let color = this.color;
      let borderColor = this.borderColor;
      let borderSize = this.borderSize;
      let radius = size > 1 ? this.size * clusterMultiplier : this.size;

      if (this.parentElement && this.parentElement.cluster) {
        if (this._hasUniqueStyles(features)) {
          let style = features[0].getStyle();
          if (style instanceof Function) {
            style = style();
          }
          const styleImage = style.getImage();
          color = styleImage.getFill().getColor();
          borderColor = styleImage.getStroke().getColor();
          borderSize = styleImage.getStroke().getWidth();
          radius = size > 1 ? styleImage.getRadius() * clusterMultiplier : styleImage.getRadius();
        } else if (this._containsStyle(features)) {
          color = this.clusterColor;
          textColor = this.clusterTextColor;
        } else {
          // default options zijn goed
        }
      }

      return new OlStyle({
        image: new OlStyleCircle({
          fill: new OlStyleFill({
            color: color,
          }),
          stroke: new OlStyleStroke({
            color: borderColor,
            width: borderSize,
          }),
          radius: radius,
        }),
        text: this._getTextStyle(feature, textColor),
      });
    };
  }

  get featureLabelFunction() {
    return (feature) => {
      const features = feature && feature.get ? (feature.get('features') || []) : [];
      const size = features.length || 1;
      return size > 1 ? size.toString() : '';
    };
  }
}

define('vl-map-layer-circle-style', VlMapLayerCircleStyle);