import React, {useState, useContext, useEffect} from 'react'
import PropTypes from 'prop-types'
import {Source, Layer} from 'react-map-gl'

import {AppContext} from '../../pages'
import {getReport, reportToGeoJSON} from '../../lib/data'

export const CountMap = ({code, map}) => {
  const {date, forcedDate} = useContext(AppContext)
  const [layerData, setLayerData] = useState(null)

  const selectedDate = forcedDate || date

  useEffect(() => {
    async function prepareLayerData() {
      const report = await getReport(selectedDate, code === 'FRA' ? 'REG' : 'DEP')
      setLayerData(reportToGeoJSON(report, selectedDate))
    }

    prepareLayerData()
  }, [selectedDate, code])

  const radiusBounds = map.radiusBounds || [0, 10, 100, 70]

  const circleLayer = {
    id: 'circle-layer',
    type: 'circle',
    source: map.property,
    filter: ['>', map.property, 0],
    paint: {
      'circle-opacity': 0.6,
      'circle-color': map.color,
      'circle-radius': [
        'interpolate',
        ['linear'],
        ['sqrt', ['number', ['get', map.property]]],
        ...radiusBounds
      ]
    }
  }

  const countLayer = {
    id: 'count-layer',
    type: 'symbol',
    source: map.property,
    filter: ['>', map.property, 0],
    layout: {
      'text-field': `{${map.property}}`,
      'text-size': 16
    }
  }

  return (
    <>
      {layerData &&
        <Source
          type='geojson'
          attribution='Données Santé publique France'
          data={layerData}
        >
          <Layer key={circleLayer.id} {...circleLayer} />
          <Layer key={countLayer.id} {...countLayer} />
        </Source>}
    </>
  )
}

CountMap.propTypes = {
  code: PropTypes.string.isRequired,
  map: PropTypes.object.isRequired
}

export const interactiveLayersIds = [
  'circle-layer'
]