const BRT_WMTS_TEMPLATE = 'https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0/standaard/EPSG:3857/{z}/{x}/{y}.png';

const RESULTAAT_LAGEN = [
  { type: 'zonnepanelen', id: 'zonnepanelen', label: 'Zonnepanelen', swatch: '#eab308', sourceId: 'resultaten-zonnepanelen', fillId: 'resultaten-zonnepanelen-fill', lineId: 'resultaten-zonnepanelen-line' },
  { type: 'dakkapel', id: 'dakkapellen', label: 'Dakkapellen', swatch: '#8b5cf6', sourceId: 'resultaten-dakkapellen', fillId: 'resultaten-dakkapellen-fill', lineId: 'resultaten-dakkapellen-line' },
  { type: 'contour', id: 'contourafwijking', label: 'Contourafwijking', swatch: '#ef4444', sourceId: 'resultaten-contourafwijking', fillId: 'resultaten-contourafwijking-fill', lineId: 'resultaten-contourafwijking-line' },
];

function tileUrlVoorKaartmateriaal(km) {
  if (!km) return null;
  if (km.type === 'wms') {
    const enc = encodeURIComponent;
    return `${km.url}?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=${enc(km.layer || '')}&CRS=EPSG:3857&BBOX={bbox-epsg-3857}&WIDTH=256&HEIGHT=256&FORMAT=image/png&STYLES=`;
  }
  if (km.type === 'wmts') {
    if ((km.naam || '').toLowerCase().includes('brt achtergrondkaart')) return BRT_WMTS_TEMPLATE;
    if (km.url.includes('{z}')) return km.url;
    const basis = km.url.replace(/\/+$/, '');
    const laag = km.layer ? `/${km.layer}` : '';
    return `${basis}${laag}/EPSG:3857/{z}/{x}/{y}.png`;
  }
  return km.url;
}

function zekerheidKleurExpressie() {
  return ['match', ['get', 'zekerheid'],
    'hoog', '#22c55e',
    'midden', '#fb923c',
    'laag', '#ef4444',
    '#888'
  ];
}

function voegResultaatLagenToe(map, laag, geojson, zichtbaar) {
  if (map.getLayer(laag.lineId)) map.removeLayer(laag.lineId);
  if (map.getLayer(laag.fillId)) map.removeLayer(laag.fillId);
  if (map.getLayer(laag.sourceId)) map.removeLayer(laag.sourceId);
  if (map.getSource(laag.sourceId)) map.removeSource(laag.sourceId);
  map.addSource(laag.sourceId, { type: 'geojson', data: geojson });
  map.addLayer({
    id: laag.fillId,
    type: 'fill',
    source: laag.sourceId,
    layout: { visibility: zichtbaar ? 'visible' : 'none' },
    paint: { 'fill-color': zekerheidKleurExpressie(), 'fill-opacity': 0.4 },
  });
  map.addLayer({
    id: laag.lineId,
    type: 'line',
    source: laag.sourceId,
    layout: { visibility: zichtbaar ? 'visible' : 'none' },
    paint: {
      'line-color': zekerheidKleurExpressie(),
      'line-width': 2,
      'line-dasharray': ['case', ['==', ['get', 'bron'], 'handmatig'], ['literal', [4, 2]], ['literal', [1]]],
    },
  });
}

function setMapLayerVisibility(map, layerIds, zichtbaar) {
  layerIds.forEach(layerId => {
    try {
      if (map.getLayer(layerId)) map.setLayoutProperty(layerId, 'visibility', zichtbaar ? 'visible' : 'none');
    } catch (_) {}
  });
}

Object.assign(window, {
  BRT_WMTS_TEMPLATE,
  RESULTAAT_LAGEN,
  tileUrlVoorKaartmateriaal,
  zekerheidKleurExpressie,
  voegResultaatLagenToe,
  setMapLayerVisibility,
});
