import Feature from '../../../../src/ol/Feature.js';
import Fill from '../../../../src/ol/style/Fill.js';
import Map from '../../../../src/ol/Map.js';
import Point from '../../../../src/ol/geom/Point.js';
import RegularShape from '../../../../src/ol/style/RegularShape.js';
import Stroke from '../../../../src/ol/style/Stroke.js';
import Style from '../../../../src/ol/style/Style.js';
import VectorLayer from '../../../../src/ol/layer/Vector.js';
import VectorSource from '../../../../src/ol/source/Vector.js';
import View from '../../../../src/ol/View.js';
import {Icon} from '../../../../src/ol/style.js';

const vectorSource = new VectorSource();
function createFeatures(stroke, fill, offSet = [0, 0]) {
  let feature;
  feature = new Feature({
    geometry: new Point([offSet[0], offSet[1]]),
  });
  // square with offset
  feature.setStyle([
    new Style({
      image: new RegularShape({
        fill: fill,
        stroke: stroke,
        points: 4,
        radius: 10,
        angle: Math.PI / 4,
        displacement: [-15, 15],
      }),
    }),
    new Style({
      image: new Icon({
        src: '/data/cross.svg',
        size: [20, 20],
        anchor: [0.5, 0.5],
        anchorXUnits: 'fraction',
        anchorYUnits: 'fraction',
        displacement: [-15, 15],
      }),
    }),
  ]);
  vectorSource.addFeature(feature);

  feature = new Feature({
    geometry: new Point([8 + offSet[0], 15 + offSet[1]]),
  });
  // triangle
  feature.setStyle(
    new Style({
      image: new RegularShape({
        fill: fill,
        stroke: stroke,
        points: 3,
        radius: 10,
        rotation: Math.PI / 4,
        angle: 0,
      }),
    })
  );
  vectorSource.addFeature(feature);

  feature = new Feature({
    geometry: new Point([-10 + offSet[0], -8 + offSet[1]]),
  });
  // star
  feature.setStyle(
    new Style({
      image: new RegularShape({
        fill: fill,
        stroke: stroke,
        points: 5,
        radius: 10,
        radius2: 4,
        angle: 0,
      }),
    })
  );
  vectorSource.addFeature(feature);

  feature = new Feature({
    geometry: new Point([12 + offSet[0], -8 + offSet[1]]),
  });
  // cross
  feature.setStyle(
    new Style({
      image: new RegularShape({
        fill: fill,
        stroke: stroke,
        points: 4,
        radius: 10,
        radius2: 0,
        angle: 0,
      }),
    })
  );
  vectorSource.addFeature(feature);

  feature = new Feature({
    geometry: new Point([8 + offSet[0], 30 + offSet[1]]),
  });
  // rectangle
  feature.setStyle(
    new Style({
      image: new RegularShape({
        fill: fill,
        stroke: stroke,
        radius: 10 / Math.SQRT2,
        radius2: 10,
        points: 4,
        angle: 0,
        scale: [1, 0.5],
      }),
    })
  );
  vectorSource.addFeature(feature);
}

createFeatures(new Stroke({width: 2}), new Fill({color: 'red'}));
createFeatures(
  new Stroke({
    lineDash: [10, 5],
  }),
  null,
  [50, 50]
);
createFeatures(
  new Stroke({
    lineDash: [10, 5],
    lineDashOffset: 5,
  }),
  null,
  [-50, -50]
);

createFeatures(new Stroke(), new Fill(), [50, -50]);

const vectorLayer = new VectorLayer({
  source: vectorSource,
});

new Map({
  target: 'map',
  layers: [vectorLayer],
  view: new View({
    center: [0, 0],
    resolution: 1,
  }),
});

render();
