import React, { useEffect, useRef, useState } from 'react'
import ReactDOM from 'react-dom'
import { Card, CardBody, CardHeader, CardText, CardTitle, Col, Label, Nav, NavItem, NavLink, Row, TabContent, TabPane } from 'reactstrap'
import Select from 'react-select'
import jquery, { data, getJSON } from 'jquery'
import collect from 'collect.js'
import { format_angka, isObjEmpty } from './util'
import { MultiSelect } from 'react-multi-select-component'
import Highcharts from 'highcharts'
import HighchartsReact from 'highcharts-react-official'
import { Toast } from 'primereact/toast'
import { Button as ButtonP } from 'primereact/button'
import 'primereact/resources/themes/bootstrap4-light-blue/theme.css'
import 'primeflex/primeflex.css'
import TabProgresifitas from './TabProgresifitas'
import TabPenugasan from './TabPenugasan'
import NipPerekam from './componentDepan/NipPerekam'
import NipPengampu from './componentDepan/NipPengampu'
import { Provider, useDispatch, useSelector } from 'react-redux'
import { store } from './store/store'
import { setSelectedOpsi } from './store/KpdlStore'
// import 'bootstrap/dist/css/bootstrap.m in.css';
// let datasend = {}

const Root = () => {
  const base_url = '/engineN/'
  const refChart1 = useRef(null)
  const toast = useRef(null)
  const dispatch = useDispatch()
  const storeKpdl = useSelector((state) => state.kpdl)
  const [dataOpsi, setDataOpsi] = useState({})
  const [active, setActive] = useState('zona')

  const [hiddenGraphMatoa, setHiddenGraphMatoa] = useState(false)

  const toggle = (tab) => {
    setActive(tab)
  }

  const [prop, setProp] = useState({})
  const [kota, setKota] = useState({})
  const [kec, setKec] = useState([])
  const [kel, setKel] = useState([])

  const [propSelected, setPropSelected] = useState({})
  const [kotaSelected, setKotaSelected] = useState({})
  const [kecSelected, setKecSelected] = useState([])
  const [kelSelected, setKelSelected] = useState([])

  const [kanwil, setKanwil] = useState({})
  const [kpp, setKpp] = useState({})
  const [seksi, setSeksi] = useState([])
  const [ar, setAr] = useState([])
  const [zp, setZp] = useState([])

  const [kanwilSelected, setKanwilSelected] = useState({})
  const [kppSelected, setKppSelected] = useState({})
  const [seksiSelected, setSeksiSelected] = useState([])
  const [arSelected, setArSelected] = useState([])
  const [zpSelected, setZpSelected] = useState([])

  const [dataSend, setDataSend] = useState({ opsiWilZona: null, adm4_pcode: [], id_poly_zona: [], nip_ar_perekam: [], nip_ar_pengampu: [] })
  const [dataGraphMatoa, setDataGraphMatoa] = useState({ poi_agg: [], kpdl_agg: [] })
  // let session = null
  const [session, setSession] = useState({})
  useEffect(() => {
    // setTimeout(() => {
    jquery.ajax({
      url: base_url + 'kewilayahan/ref/user',
      method: 'GET',
      dataType: 'json',
      success: (data) => {
        setSession(data)
        if (data.kppadm === '000') {
          toggle('wilayah')
        } else {
          toggle('zona')
        }
      }
    })
    // }, 2000)

    jquery.ajax({
      url: base_url + 'kewilayahan/ref/propinsi',
      method: 'GET',
      dataType: 'json',
      success: (data) => {
        setProp(data)
      }
    })

    jquery.ajax({
      url: base_url + 'kewilayahan/ref/zpkanwil',
      method: 'GET',
      dataType: 'json',
      success: (data) => {
        setKanwil(data)
      }
    })

    jquery.getJSON(base_url + 'kewilayahan/ref/opsi').then((response) => {
      setDataOpsi(response)
      dispatch(setSelectedOpsi(response.default))
    })

    let judul = document.getElementById('judul')
    judul.innerHTML = '<h3><b><strong>E-Geospatial Thematic Tax</strong></b></h3>'
  }, [])

  useEffect(() => {
    setKota({})
    setKec([])
    setKel([])
    setKotaSelected({})
    setKecSelected([])
    setKelSelected([])
    if (propSelected && !isObjEmpty(propSelected)) {
      const prop = propSelected.value
      jquery.ajax({
        url: base_url + 'kewilayahan/ref/kota',
        method: 'GET',
        dataType: 'json',
        data: { prop },
        success: (data) => {
          setKota(data)
        }
      })
    }
  }, [propSelected])

  useEffect(() => {
    setKec([])
    setKel([])
    setKecSelected([])
    setKelSelected([])
    if (kotaSelected && !isObjEmpty(kotaSelected)) {
      const kota = kotaSelected.value
      jquery.ajax({
        url: base_url + 'kewilayahan/ref/kecamatan',
        method: 'GET',
        dataType: 'json',
        data: { kota },
        success: (data) => {
          setKec(data)
        }
      })
    }
  }, [kotaSelected])

  useEffect(() => {
    setKel([])
    setKelSelected([])
    if (kecSelected.length && !isObjEmpty(kecSelected)) {
      const kec = collect(kecSelected).pluck('value').all()
      jquery.ajax({
        url: base_url + 'kewilayahan/ref/kelurahan',
        method: 'POST',
        dataType: 'json',
        data: { kec },
        success: (data) => {
          setKel(data)
        }
      })
    }
  }, [kecSelected])

  useEffect(() => {
    setKpp(null)
    setSeksi([])
    setAr([])
    setZp([])
    setKppSelected(null)
    setSeksiSelected([])
    setArSelected([])
    setZpSelected([])
    if (kanwilSelected && !isObjEmpty(kanwilSelected)) {
      const kanwil = kanwilSelected.value
      jquery.ajax({
        url: base_url + 'kewilayahan/ref/zpkpp',
        method: 'POST',
        dataType: 'json',
        data: { kanwil },
        success: (data) => {
          setKpp(data)
        }
      })
    }
  }, [kanwilSelected])

  useEffect(() => {
    setSeksi([])
    setAr([])
    setZp([])
    setSeksiSelected([])
    setArSelected([])
    setZpSelected([])
    if (kppSelected && !isObjEmpty(kppSelected)) {
      const kpp = kppSelected.value
      jquery.ajax({
        url: base_url + 'kewilayahan/ref/zpseksi',
        method: 'POST',
        dataType: 'json',
        data: { kpp },
        success: (data) => {
          setSeksi(data)
        }
      })
    }
  }, [kppSelected])

  useEffect(() => {
    setAr([])
    setZp([])
    setArSelected([])
    setZpSelected([])
    if (seksiSelected && !isObjEmpty(seksiSelected)) {
      const kpp = kppSelected.value
      const seksi = collect(seksiSelected).pluck('value').all()

      jquery.ajax({
        url: base_url + 'kewilayahan/ref/zpar',
        method: 'POST',
        dataType: 'json',
        data: { kpp, seksi },
        success: (data) => {
          setAr(data)
        }
      })
    }
  }, [seksiSelected])

  useEffect(() => {
    setZp([])
    setZpSelected([])
    if (arSelected && !isObjEmpty(arSelected)) {
      const kpp = kppSelected.value
      const seksi = collect(seksiSelected).pluck('value').all()
      const ar = collect(arSelected).pluck('value').all()
      jquery.ajax({
        url: base_url + 'kewilayahan/ref/zpzp',
        method: 'POST',
        dataType: 'json',
        data: { kpp, seksi, ar },
        success: (data) => {
          setZp(data)
        }
      })
    }
  }, [arSelected])

  const buttonProsesOnClick = () => {
    const opsiWilZona = active
    const adm4_pcode = collect(kelSelected).pluck('value').all()
    const id_poly_zona = collect(zpSelected).pluck('value').all()
    const nip_ar_pengampu = collect().pluck('value').all()

    switch (opsiWilZona) {
      case 'wilayah':
        if (adm4_pcode.length) {
          dispatch(setSelectedOpsi(dataOpsi.wilayah))
          setDataSend({ opsiWilZona: dataOpsi.wilayah.key, adm4_pcode, id_poly_zona: [] })
          setHiddenGraphMatoa(false)
        } else {
          toast.current.show({ severity: 'info', summary: 'Info', detail: 'Kelurahan harus dipilih' })
        }
        break
      case 'zona':
        if (id_poly_zona.length) {
          dispatch(setSelectedOpsi(dataOpsi.zona))
          setDataSend({ opsiWilZona: dataOpsi.zona.key, adm4_pcode: [], id_poly_zona })
          setHiddenGraphMatoa(false)
        } else {
          toast.current.show({ severity: 'info', summary: 'Info', detail: 'Zona harus dipilih' })
        }
        break

      default:
        break
    }
  }

  useEffect(() => {}, [storeKpdl.selectedOpsi])

  // useEffect(() => {
  //   Highcharts.setOptions({
  //     accessibility: false,
  //     lang: {
  //       decimalPoint: ',',
  //       thousandsSep: '.',
  //       numericSymbols: ['rb', 'jt', 'M', 'T', 'P', 'E']
  //     },

  //     tooltip: {
  //       yDecimals: 2 // If you want to add 2 decimals
  //     }
  //   })
  //   jquery.ajax({
  //     url: base_url + 'kewilayahan/kytp/graph_matoa',
  //     dataType: 'json',
  //     type: 'POST',
  //     data: { ...dataSend },
  //     success: (data) => {
  //       setDataGraphMatoa(data)
  //     }
  //   })
  // }, [dataSend])

  const optionsGraphMatoaAgg = {
    chart: {
      zoomType: 'xy',
      height: '320'
    },
    title: {
      text: 'Poi Google Vs Matoa',
      style: { fontSize: '14px' }
    },

    xAxis: [
      {
        categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
        crosshair: true
      }
    ],
    yAxis: [
      {
        gridLineWidth: 0,
        title: {
          text: '',
          style: {
            color: Highcharts.getOptions().colors[0]
          }
        },
        labels: {
          //format: '{value}',
          style: {
            color: Highcharts.getOptions().colors[0]
          }
        },
        visible: false
      },
      {
        labels: {
          //format: '{value}',
          style: {
            color: Highcharts.getOptions().colors[1]
          }
        },
        title: {
          text: 'NPWP Work True',
          style: {
            color: Highcharts.getOptions().colors[1]
          }
        },
        opposite: true,
        visible: false
      },
      {
        gridLineWidth: 0,
        title: {
          text: 'Rupiah',
          style: {
            color: Highcharts.getOptions().colors[2]
          }
        },
        labels: {
          //format: '{value}',
          style: {
            color: Highcharts.getOptions().colors[2]
          }
        },
        opposite: true,
        visible: false
      },
      {
        gridLineWidth: 0,
        title: {
          text: '',
          style: {
            color: '#FF0000'
          }
        },
        labels: {
          //format: '{value}',
          style: {
            color: '##FF0000'
          }
        },
        opposite: true
      }
    ],
    tooltip: {
      shared: true
    },
    legend: {
      layout: 'horizontal',
      align: 'center',
      //x: 80,
      verticalAlign: 'top',
      //y: 55,
      //floating: true,
      backgroundColor:
        Highcharts.defaultOptions.legend.backgroundColor || // theme
        'rgba(255,255,255,0.25)'
    },
    series: [
      {
        color: '#FF0000',
        name: 'Jml PoI',
        type: 'column',
        yAxis: 3,
        data: dataGraphMatoa.poi_agg,
        marker: {
          enabled: true
        },
        tooltip: {
          valueSuffix: ' PoI'
        }
      },
      {
        name: 'Matoa',
        type: 'spline',
        yAxis: 3,
        data: dataGraphMatoa.kpdl_agg,
        marker: {
          enabled: true
        },
        tooltip: {
          pointFormatter: function () {
            const idx = this.index
            let pct_coverage
            const jml_poi_agg = dataGraphMatoa.poi_agg
            if (jml_poi_agg[idx] && jml_poi_agg[idx] !== 0) {
              pct_coverage = format_angka(parseFloat((parseFloat(this.y) / jml_poi_agg[idx]) * 100).toFixed(2)) + '%'
            }

            let s =
              '<span style="color:' +
              this.color +
              '">\u25CF</span> ' +
              this.series.name +
              ': <b>' +
              format_angka(this.y) +
              ' lokasi kpdl</b> ' +
              (pct_coverage ? '(' + pct_coverage + ')<br>\n' : '<br>')
            return s
          },
          shared: false
        },
        visible: true,
        color: '#8000ff'
      }
    ]
  }

  return (
    <>
      <Row>
        <Col sm="12">
          <Card>
            <CardBody>
              <Nav tabs>
                {session.kppadm === '000' ? (
                  <NavItem>
                    <NavLink
                      style={{ cursor: 'pointer' }}
                      active={active === 'wilayah'}
                      onClick={() => {
                        toggle('wilayah')
                      }}
                    >
                      Wilayah Adm.
                    </NavLink>
                  </NavItem>
                ) : null}
                <NavItem>
                  <NavLink
                    style={{ cursor: 'pointer' }}
                    active={active === 'zona'}
                    onClick={() => {
                      toggle('zona')
                    }}
                  >
                    Zona Pengawasan
                  </NavLink>
                </NavItem>
                <NavItem>
                  <NavLink
                    style={{ cursor: 'pointer' }}
                    active={active === 'perekam'}
                    onClick={() => {
                      toggle('perekam')
                    }}
                  >
                    Perekam
                  </NavLink>
                </NavItem>
                <NavItem>
                  <NavLink
                    style={{ cursor: 'pointer' }}
                    active={active === 'pengampu'}
                    onClick={() => {
                      toggle('pengampu')
                    }}
                  >
                    Pengampu
                  </NavLink>
                </NavItem>
              </Nav>
              <TabContent className="py-3" activeTab={active}>
                <TabPane tabId="wilayah">
                  <Row>
                    <Col md="3">
                      <Label className="form-label" for="basicInput">
                        Propinsi
                      </Label>
                      <Select
                        placeholder="Pilih Propinsi"
                        className="basic-single w-100"
                        onChange={(e) => {
                          setPropSelected(e)
                        }}
                        classNamePrefix="select"
                        defaultValue={propSelected}
                        value={propSelected}
                        isClearable={false}
                        options={prop}
                      />
                    </Col>
                    <Col md="3">
                      <Label className="form-label" for="basicInput">
                        Kota/Kab
                      </Label>
                      <Select
                        placeholder="Pilih Kota/Kab"
                        className="basic-single w-100"
                        onChange={(e) => {
                          setKotaSelected(e)
                        }}
                        classNamePrefix="select"
                        defaultValue={kotaSelected}
                        value={kotaSelected}
                        isClearable={false}
                        options={kota}
                      />
                    </Col>
                    <Col md="3">
                      <Label className="form-label" for="Pilih Kecamatan">
                        Kecamatan
                      </Label>
                      <MultiSelect
                        className="me-1 w-full"
                        hasSelectAll={true}
                        debounceDuration={300}
                        options={kec}
                        value={kecSelected}
                        onChange={(e) => {
                          setKecSelected(e)
                        }}
                        labelledBy="Pilih Kecamatan"
                        overrideStrings={{ allItemsAreSelected: 'Semua dipilih', selectSomeItems: 'Pilih Kecamatan' }}
                      />
                    </Col>
                    <Col md="3">
                      <Label className="form-label" for="Pilih Kelurahan">
                        Kelurahan
                      </Label>
                      <MultiSelect
                        className="me-1 w-full"
                        hasSelectAll={true}
                        debounceDuration={300}
                        options={kel}
                        value={kelSelected}
                        onChange={(e) => {
                          setKelSelected(e)
                        }}
                        labelledBy="Pilih Kelurahan"
                        overrideStrings={{ allItemsAreSelected: 'Semua dipilih', selectSomeItems: 'Pilih Kelurahan' }}
                      />
                    </Col>
                  </Row>
                  <Row className="mt-2">
                    <Col sm="12">
                      <ButtonP onClick={() => buttonProsesOnClick()} label="Proses" severity="" rounded className="w-10rem text-white text-base" />
                    </Col>
                  </Row>
                </TabPane>
                <TabPane tabId="zona">
                  <Row>
                    <Col md="3">
                      <Label className="form-label" for="basicInput">
                        Kanwil
                      </Label>
                      <Select
                        placeholder="Pilih Kanwil"
                        className="basic-single w-100"
                        onChange={(e) => {
                          setKanwilSelected(e)
                        }}
                        classNamePrefix="select"
                        // defaultValue={kanwilSelected}
                        value={kanwilSelected}
                        isClearable={false}
                        options={kanwil}
                      />
                    </Col>
                    <Col md="3">
                      <Label className="form-label" for="Pilih KPP">
                        KPP
                      </Label>
                      <Select
                        placeholder="Pilih KPP"
                        className="basic-single w-100"
                        onChange={(e) => {
                          setKppSelected(e)
                        }}
                        classNamePrefix="select"
                        // defaultValue={kanwilSelected}
                        value={kppSelected}
                        isClearable={false}
                        options={kpp}
                      />
                    </Col>
                    <Col md="3">
                      <Label className="form-label" for="Pilih Seksi">
                        Seksi
                      </Label>
                      <MultiSelect
                        className="me-1 w-full"
                        hasSelectAll={true}
                        debounceDuration={300}
                        options={seksi}
                        value={seksiSelected}
                        onChange={(e) => {
                          setSeksiSelected(e)
                        }}
                        labelledBy="Pilih Seksi"
                        overrideStrings={{ allItemsAreSelected: 'Semua dipilih', selectSomeItems: 'Pilih Seksi' }}
                      />
                    </Col>
                    <Col md="3">
                      <Label className="form-label" for="Pilih AR">
                        AR
                      </Label>
                      <MultiSelect
                        className="me-1 w-full"
                        hasSelectAll={true}
                        debounceDuration={300}
                        options={ar}
                        value={arSelected}
                        onChange={(e) => {
                          setArSelected(e)
                        }}
                        labelledBy="Pilih AR"
                        overrideStrings={{ allItemsAreSelected: 'Semua dipilih', selectSomeItems: 'Pilih AR' }}
                      />
                    </Col>
                  </Row>
                  <Row className="mt-2">
                    <Col md="3">
                      <Label className="form-label" for="Pilih Zona">
                        Zona Pengawasan
                      </Label>
                      <MultiSelect
                        className="me-1 w-full"
                        hasSelectAll={true}
                        debounceDuration={300}
                        options={zp}
                        value={zpSelected}
                        onChange={(e) => {
                          setZpSelected(e)
                        }}
                        labelledBy="Pilih Zona"
                        overrideStrings={{ allItemsAreSelected: 'Semua dipilih', selectSomeItems: 'Pilih Zona' }}
                      />
                    </Col>
                    <Col md="3" className="pt-4">
                      <ButtonP onClick={() => buttonProsesOnClick()} label="Proses" severity="" rounded className="w-10rem text-white text-base" />
                    </Col>
                  </Row>
                </TabPane>
                <TabPane tabId="perekam">
                  <NipPerekam
                    dataSend={dataSend}
                    setDataSend={setDataSend}
                    activeTab={active}
                    toast={toast}
                    setHiddenGraphMatoa={setHiddenGraphMatoa}
                    dataOpsi={dataOpsi}
                  />
                </TabPane>
                <TabPane tabId="pengampu">
                  <NipPengampu
                    dataSend={dataSend}
                    setDataSend={setDataSend}
                    activeTab={active}
                    toast={toast}
                    setHiddenGraphMatoa={setHiddenGraphMatoa}
                    dataOpsi={dataOpsi}
                  />
                </TabPane>
              </TabContent>
            </CardBody>
          </Card>
        </Col>
      </Row>
      {/* <Row hidden={['pengampu', 'perekam'].includes(storeKpdl.selectedOpsi?.name)}>
        <Col sm="12">
          <Card>
            <CardHeader className="d-flex justify-content-center p-2">
              <CardTitle tag={'h1'} className="font-weight-bold">
                Statistik Penguasaan Wilayah
              </CardTitle>
            </CardHeader>
            <CardBody className="p-1">
              <div id="graph_matoa_agg">
                <HighchartsReact ref={refChart1} highcharts={Highcharts} options={optionsGraphMatoaAgg} />
              </div>
              <div className="pl-3 pb-1">Berdasarkan : Zona Pengawasan yang diampu unit</div>
            </CardBody>
          </Card>
        </Col>
      </Row> */}
      <Row>
        <Col sm="12">
          <Card>
            <CardHeader className="d-flex justify-content-center p-2">
              <CardTitle tag={'h1'} className="font-weight-bold text-center">
                Tindak Lanjut Pengawasan KPD Matoa : registrasi, pembayaran, dan pelaporan SPT
                <br />
                Tahun kegiatan 2024
              </CardTitle>
            </CardHeader>
            <CardBody>
              <TabProgresifitas dataSend={dataSend} />
            </CardBody>
          </Card>
        </Col>
      </Row>
      <Row>
        <Col sm="12">
          <TabPenugasan dataSend={dataSend} />
        </Col>
      </Row>
      <Toast ref={toast} />
    </>
  )
}

const container = document.getElementById('app')
const component = (
  <Provider store={store}>
    <Root />
  </Provider>
)

ReactDOM.render(component, container)