import { useRef, useState, useEffect } from 'react'
import { useLocation } from 'react-router-dom'
import { Card, Flex, Space } from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel'
import config from '../../../../config'
import useCollapseState from '../../hooks/useCollapseState'
import NotesPanel from '../../common/NotesPanel'
import InfoCollapse from '../../common/InfoCollapse'
import ObjectInfo from '../../common/ObjectInfo'
import ViewButton from '../../common/ViewButton'
import InfoCircleIcon from '../../../Icons/InfoCircleIcon.jsx'
import NoteIcon from '../../../Icons/NoteIcon.jsx'
import AuditLogIcon from '../../../Icons/AuditLogIcon.jsx'
import ObjectForm from '../../common/ObjectForm'
import EditButtons from '../../common/EditButtons'
import ObjectTableNavigationButtons from '../../common/ObjectTableNavigationButtons.jsx'
import ActivityIndicator from '../../common/ActivityIndicator.jsx'
import ActionHandler from '../../common/ActionHandler'
import { useActions } from '../../context/ActionsContext'
import ObjectActions from '../../common/ObjectActions.jsx'
import ObjectTable from '../../common/ObjectTable.jsx'
import InfoCollapsePlaceholder from '../../common/InfoCollapsePlaceholder.jsx'
import FilamentIcon from '../../../Icons/FilamentIcon.jsx'
import FilamentSkuIcon from '../../../Icons/FilamentSkuIcon.jsx'
import DocumentPrintButton from '../../common/DocumentPrintButton.jsx'
import ScrollBox from '../../common/ScrollBox.jsx'
import UserNotifierToggle from '../../common/UserNotifierToggle.jsx'

const log = loglevel.getLogger('FilamentInfo')
log.setLevel(config.logLevel)

const FilamentInfo = () => {
  const location = useLocation()
  const objectFormRef = useRef(null)
  const actionHandlerRef = useRef(null)
  const filamentId = new URLSearchParams(location.search).get('filamentId')
  const filamentSkusTableRef = useRef()

  const { setOnModalOk } = useActions()
  useEffect(() => {
    setOnModalOk(() => () => {
      filamentSkusTableRef.current?.reload?.()
    })
    return () => setOnModalOk(null)
  }, [setOnModalOk])
  const [collapseState, updateCollapseState] = useCollapseState(
    'FilamentInfo',
    {
      info: true,
      filamentSkus: true,
      stocks: true,
      notes: true,
      auditLogs: false
    }
  )

  const [objectFormState, setEditFormState] = useState({
    isEditing: false,
    editLoading: false,
    formValid: false,
    lock: null,
    loading: false,
    objectData: {}
  })

  const actions = {
    edit: () => {
      objectFormRef?.current?.startEditing?.()
      return false
    },
    cancelEdit: () => {
      objectFormRef?.current?.cancelEditing?.()
      return true
    },
    finishEdit: () => {
      objectFormRef?.current?.handleUpdate?.()
      return true
    },
    delete: () => {
      objectFormRef?.current?.handleDelete?.()
      return true
    }
  }

  return (
    <Flex
      gap='large'
      vertical='true'
      style={{
        maxHeight: '100%',
        minHeight: 0
      }}
    >
      <Flex justify={'space-between'}>
        <Space size='small'>
          <Space size='small'>
            <ObjectActions
              type='filament'
              id={filamentId}
              disabled={objectFormState.loading}
              objectData={objectFormState.objectData}
            />
            <ViewButton
              disabled={objectFormState.loading}
              items={[
                { key: 'info', label: 'Filament Information' },
                { key: 'filamentSkus', label: 'Filament SKUs' },
                { key: 'stocks', label: 'Filament Stocks' },
                { key: 'notes', label: 'Notes' },
                { key: 'auditLogs', label: 'Audit Logs' }
              ]}
              visibleState={collapseState}
              updateVisibleState={updateCollapseState}
            />
            <UserNotifierToggle
              type='filament'
              objectData={objectFormState.objectData}
              disabled={objectFormState.loading}
            />
            <DocumentPrintButton
              type='filament'
              objectData={objectFormState.objectData}
              disabled={objectFormState.loading}
            />
          </Space>
          <ActivityIndicator
            activities={objectFormState.activities}
            showStartingDivider={true}
          />
        </Space>
        <Space>
          <EditButtons
            isEditing={objectFormState.isEditing}
            handleUpdate={() => {
              actionHandlerRef.current.callAction('finishEdit')
            }}
            cancelEditing={() => {
              actionHandlerRef.current.callAction('cancelEdit')
            }}
            startEditing={() => {
              actionHandlerRef.current.callAction('edit')
            }}
            editLoading={objectFormState.editLoading}
            formValid={objectFormState.formValid}
            disabled={
              objectFormState.beingEditedByOther || objectFormState.loading
            }
            loading={objectFormState.editLoading}
          />
          <ObjectTableNavigationButtons
            disabled={objectFormState.loading || objectFormState.isEditing}
            _id={filamentId}
            objectType='filament'
            showEndingDivider={true}
          />
        </Space>
      </Flex>

      <ScrollBox>
        <Flex vertical gap={'large'}>
          <ActionHandler
            actions={actions}
            loading={objectFormState.loading}
            ref={actionHandlerRef}
          >
            <InfoCollapse
              title='Filament Information'
              icon={<InfoCircleIcon />}
              active={collapseState.info}
              onToggle={(expanded) => updateCollapseState('info', expanded)}
              collapseKey='info'
            >
              <ObjectForm
                id={filamentId}
                type='filament'
                style={{ height: '100%' }}
                ref={objectFormRef}
                setCurrentObject={true}
                onStateChange={(state) => {
                  setEditFormState((prev) => ({ ...prev, ...state }))
                }}
              >
                {({ loading, isEditing, objectData }) => {
                  return (
                    <ObjectInfo
                      loading={loading}
                      indicator={<LoadingOutlined />}
                      isEditing={isEditing}
                      type='filament'
                      objectData={objectData}
                    />
                  )
                }}
              </ObjectForm>
            </InfoCollapse>
          </ActionHandler>

          <InfoCollapse
            title='Filament SKUs'
            icon={<FilamentSkuIcon />}
            active={collapseState.filamentSkus}
            onToggle={(expanded) =>
              updateCollapseState('filamentSkus', expanded)
            }
            collapseKey='filamentSkus'
          >
            {objectFormState.loading ? (
              <InfoCollapsePlaceholder />
            ) : (
              <ObjectTable
                ref={filamentSkusTableRef}
                type='filamentSku'
                masterFilter={{ filament: filamentId }}
                visibleColumns={{ filament: false }}
              />
            )}
          </InfoCollapse>

          <InfoCollapse
            title='Filament Stocks'
            icon={<FilamentIcon />}
            active={collapseState.stocks}
            onToggle={(expanded) => updateCollapseState('stocks', expanded)}
            collapseKey='stocks'
          >
            {objectFormState.loading ? (
              <InfoCollapsePlaceholder />
            ) : (
              <ObjectTable
                type='filamentStock'
                masterFilter={{ filament: filamentId }}
                visibleColumns={{
                  filament: false,
                  startingWeight: false
                }}
              />
            )}
          </InfoCollapse>

          <InfoCollapse
            title='Notes'
            icon={<NoteIcon />}
            active={collapseState.notes}
            onToggle={(expanded) => updateCollapseState('notes', expanded)}
            collapseKey='notes'
          >
            <Card>
              <NotesPanel _id={filamentId} type='filament' />
            </Card>
          </InfoCollapse>

          <InfoCollapse
            title='Audit Logs'
            icon={<AuditLogIcon />}
            active={collapseState.auditLogs}
            onToggle={(expanded) => updateCollapseState('auditLogs', expanded)}
            collapseKey='auditLogs'
          >
            {objectFormState.loading ? (
              <InfoCollapsePlaceholder />
            ) : (
              <ObjectTable
                type='auditLog'
                masterFilter={{ 'parent._id': filamentId }}
                visibleColumns={{ _id: false, 'parent._id': false }}
              />
            )}
          </InfoCollapse>
        </Flex>
      </ScrollBox>
    </Flex>
  )
}

export default FilamentInfo
