import React from 'react'
import ReactApexChart from 'react-apexcharts'
import './styles.css'

// Seeded PRNG so the bubbles are identical on every load (stable snapshots).
var __seed = 0x3d0b7e21
function rand() {
  __seed |= 0
  __seed = (__seed + 0x6d2b79f5) | 0
  var t = Math.imul(__seed ^ (__seed >>> 15), 1 | __seed)
  t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t
  return ((t ^ (t >>> 14)) >>> 0) / 4294967296
}

// Each point is [date, conversionRate %, impressions]. The third value drives
// the bubble size, so a bigger bubble = more impressions that day.
function generateData(baseval, count, yrange, zrange) {
  var series = []
  for (var i = 0; i < count; i++) {
    var y = Math.floor(rand() * (yrange.max - yrange.min + 1)) + yrange.min
    var z = Math.floor(rand() * (zrange.max - zrange.min + 1)) + zrange.min
    series.push([baseval, y, z])
    baseval += 86400000
  }
  return series
}

const ApexChart = () => {
  const [state, setState] = React.useState({
    series: [
      {
        name: 'Search',
        data: generateData(
          new Date('01 Jun 2024 GMT').getTime(),
          20,
          { min: 35, max: 60 },
          { min: 40, max: 75 },
        ),
      },
      {
        name: 'Social',
        data: generateData(
          new Date('01 Jun 2024 GMT').getTime(),
          20,
          { min: 20, max: 45 },
          { min: 30, max: 70 },
        ),
      },
      {
        name: 'Email',
        data: generateData(
          new Date('01 Jun 2024 GMT').getTime(),
          20,
          { min: 10, max: 30 },
          { min: 15, max: 45 },
        ),
      },
      {
        name: 'Display',
        data: generateData(
          new Date('01 Jun 2024 GMT').getTime(),
          20,
          { min: 5, max: 25 },
          { min: 20, max: 60 },
        ),
      },
    ],
    options: {
      chart: {
        height: 350,
        type: 'bubble',
      },
      dataLabels: {
        enabled: false,
      },
      fill: {
        type: 'gradient',
      },
      title: {
        text: 'Channel Performance Over Time',
      },
      subtitle: {
        text: 'Bubble size = daily impressions',
      },
      xaxis: {
        tickAmount: 12,
        type: 'datetime',
        labels: {
          rotate: 0,
        },
      },
      yaxis: {
        max: 70,
        title: {
          text: 'Conversion Rate (%)',
        },
      },
      theme: {
        palette: 'palette2',
      },
    },
  })

  return (
    <div>
      <div id="chart">
        <ReactApexChart
          options={state.options}
          series={state.series}
          type="bubble"
          height={350}
        />
      </div>
    </div>
  )
}

export default ApexChart
3D Bubble - React Bubble Charts | ApexCharts.js | ApexCharts.js