import MVT from '../src/ol/format/MVT.js';
import TileGrid from '../src/ol/tilegrid/TileGrid.js';
import VectorTileSource from '../src/ol/source/VectorTile.js';
import View from '../src/ol/View.js';

import olms from 'ol-mapbox-style';
import {defaultResolutions} from 'ol-mapbox-style/dist/util.js';

const key = 'get_your_own_D6rA4zTHduk6KOKTXzGB';

// Match the server resolutions
const maxResolution = 360 / 512;
defaultResolutions.length = 14;
for (let i = 0; i < 14; ++i) {
  defaultResolutions[i] = maxResolution / Math.pow(2, i + 1);
}

olms(
  'map',
  'https://api.maptiler.com/maps/basic-4326/style.json?key=' + key
).then(function (map) {
  // Custom tile grid for the EPSG:4326 projection
  const tileGrid = new TileGrid({
    extent: [-180, -90, 180, 90],
    tileSize: 512,
    resolutions: defaultResolutions,
  });

  const mapboxStyle = map.get('mapbox-style');

  // Replace the source with a EPSG:4326 projection source for each vector tile layer
  map.getLayers().forEach(function (layer) {
    const mapboxSource = layer.get('mapbox-source');
    if (mapboxSource && mapboxStyle.sources[mapboxSource].type === 'vector') {
      const source = layer.getSource();
      layer.setSource(
        new VectorTileSource({
          format: new MVT(),
          projection: 'EPSG:4326',
          urls: source.getUrls(),
          tileGrid: tileGrid,
        })
      );
    }
  });

  // Configure the map with a view with EPSG:4326 projection
  map.setView(
    new View({
      projection: 'EPSG:4326',
      zoom: mapboxStyle.zoom,
      center: mapboxStyle.center,
    })
  );
});
