import { useState, useEffect } from 'react'
import { Input } from 'antd'
import moment from 'moment'
import { EditableTable, DatePickerWrapper, SelectFromDictionary, numericColumnOptions, makeColumn } from "../../components/Table"
import LoaderPortal from '../../components/LoaderPortal'
import { invokeWebApiWrapperAsync } from '../../components/factory'
import { WellOperationService} from '../../services/api'
import { dictionarySectionType, getByKeyOrReturnKey } from './dictionary'

const { TextArea } = Input;

const basePageSize = 160;
const format='YYYY.MM.DD HH:mm'

export const WellOperationsEditor = ({idWell, idType}) => {
  const [pageNumAndPageSize, setPageNumAndPageSize] = useState({current:1, pageSize:basePageSize})
  const [paginationTotal, setPaginationTotal] = useState(0)
  const [dictionaryOperationCategory, setDictionaryOperationCategory] = useState(new Map())
  const [operations, setOperations] = useState([])
  const [showLoader, setShowLoader] = useState(false)
  
  useEffect(() => invokeWebApiWrapperAsync(
    async () => {
      const categories = await WellOperationService.getCategories(idWell)
      const dictCategories = new Map()
      categories?.forEach((item) => dictCategories.set(item.id, item.name))
      setDictionaryOperationCategory(dictCategories)
    }),[idWell])

  const updateOperations = () => invokeWebApiWrapperAsync(
    async () => {
      const skip = ((pageNumAndPageSize.current - 1) * pageNumAndPageSize.pageSize) || 0
      const take = pageNumAndPageSize.pageSize
      const paginatedOperations = await WellOperationService.getOperations(idWell, idType, undefined, undefined, undefined, undefined, skip, take )
      const operations = paginatedOperations?.items ?? []
      setOperations(operations)
      const total = paginatedOperations.count?? paginatedOperations.items?.length ?? 0      
      setPaginationTotal(total)
    },
    setShowLoader,
    'Не удалось загрузить список операций по скважине'
  )

  useEffect(updateOperations, [idWell, idType, pageNumAndPageSize])

  const columns = [
    makeColumn('Конструкция секции','idWellSectionType', {
      editable:true,
      input:<SelectFromDictionary dictionary={dictionarySectionType}/>,
      width:110,
      render:(_, record)=>getByKeyOrReturnKey(dictionarySectionType, record.idWellSectionType)
    }),
    makeColumn('Операция','idCategory', {
      editable:true,
      input:<SelectFromDictionary dictionary={dictionaryOperationCategory}/>, 
      width:200,
      render:(_, record)=>getByKeyOrReturnKey(dictionaryOperationCategory, record.idCategory)
    }),
    makeColumn('Доп. инфо','categoryInfo', {editable:true, width:300, input:<TextArea/>}),
    makeColumn('Глубина забоя','wellDepth', numericColumnOptions),
    makeColumn('Время начала','startDate', {
      editable:true, 
      width:200, 
      input:<DatePickerWrapper/>,
      render:(_, record) => moment.utc(record.startDate).local().format(format)
    }),
    makeColumn('Часы','durationHours', numericColumnOptions),
    makeColumn('Комментарий','comment', {editable:true, input:<TextArea/>}),
  ]

  const onAdd = async (operation) => {
    operation.idType = idType
    await WellOperationService.insertRange(idWell, [operation])
    updateOperations()
  }

  const onEdit= async (operation) => {
    if(!operation.id)
      return
    operation.idType = idType
    await WellOperationService.update(idWell, operation.id, operation)
    updateOperations()
  }

  const onDelete= async (operation) => {
    if(!operation.id)
      return
    await WellOperationService.delete(idWell, operation.id)
    updateOperations()
  }

  return <LoaderPortal show={showLoader}>
    <EditableTable
      size='small'
      bordered
      columns={columns}
      dataSource={operations}
      onRowAdd={onAdd}
      onRowEdit={onEdit}
      onRowDelete={onDelete}
      pagination={{
        current: pageNumAndPageSize.current,
        pageSize: pageNumAndPageSize.pageSize,
        showSizeChanger: false,
        total: paginationTotal,
        onChange: (page, pageSize) => setPageNumAndPageSize({current: page, pageSize: pageSize})
      }}
      />
  </LoaderPortal> 
}