import { useRef, useState } from 'react'
import { useLocation } from 'react-router-dom'
import { Card, Flex, Modal, Space } from 'antd'
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 ObjectForm from '../../common/ObjectForm'
import EditButtons from '../../common/EditButtons'
import ObjectTableNavigationButtons from '../../common/ObjectTableNavigationButtons.jsx'
import ActivityIndicator from '../../common/ActivityIndicator.jsx'
import InfoCircleIcon from '../../../Icons/InfoCircleIcon.jsx'
import NoteIcon from '../../../Icons/NoteIcon.jsx'
import AuditLogIcon from '../../../Icons/AuditLogIcon.jsx'
import ActionHandler from '../../common/ActionHandler.jsx'
import ObjectActions from '../../common/ObjectActions.jsx'
import ObjectTable from '../../common/ObjectTable.jsx'
import InfoCollapsePlaceholder from '../../common/InfoCollapsePlaceholder.jsx'
import DocumentPrintButton from '../../common/DocumentPrintButton.jsx'
import UserNotifierToggle from '../../common/UserNotifierToggle.jsx'
import ScrollBox from '../../common/ScrollBox.jsx'
import PartSkuIcon from '../../../Icons/PartSkuIcon.jsx'
import NewPartSku from '../PartSkus/NewPartSku'

const PartInfo = () => {
  const location = useLocation()
  const objectFormRef = useRef(null)
  const actionHandlerRef = useRef(null)
  const partId = new URLSearchParams(location.search).get('partId')
  const [newPartSkuOpen, setNewPartSkuOpen] = useState(false)
  const partSkusTableRef = useRef()
  const [collapseState, updateCollapseState] = useCollapseState('PartInfo', {
    info: true,
    partSkus: true,
    notes: true,
    auditLogs: false
  })
  const [objectFormState, setEditFormState] = useState({
    isEditing: false,
    editLoading: false,
    formValid: false,
    lock: null,
    loading: false,
    objectData: {}
  })

  const actions = {
    newPartSku: () => {
      setNewPartSkuOpen(true)
      return true
    },
    edit: () => {
      objectFormRef?.current?.startEditing?.()
      return false
    },
    cancelEdit: () => {
      objectFormRef?.current?.cancelEditing?.()
      return true
    },
    finishEdit: () => {
      objectFormRef?.current?.handleUpdate?.()
      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='part'
                id={partId}
                disabled={objectFormState.loading}
                objectData={objectFormState.objectData}
              />
              <ViewButton
                disabled={objectFormState.loading}
                items={[
                  { key: 'info', label: 'Part Information' },
                  { key: 'partSkus', label: 'Part SKUs' },
                  { key: 'notes', label: 'Notes' },
                  { key: 'auditLogs', label: 'Audit Logs' }
                ]}
                visibleState={collapseState}
                updateVisibleState={updateCollapseState}
              />
              <UserNotifierToggle
                type='part'
                objectData={objectFormState.objectData}
                disabled={objectFormState.loading}
              />
              <DocumentPrintButton
                type='part'
                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}
              _id={partId}
              objectType='part'
              showEndingDivider={true}
            />
          </Space>
        </Flex>
        <ScrollBox>
          <Flex vertical gap={'large'}>
            <ActionHandler
              actions={actions}
              loading={objectFormState.loading}
              ref={actionHandlerRef}
            >
              <ObjectForm
                id={partId}
                type='part'
                style={{ height: '100%' }}
                ref={objectFormRef}
                onStateChange={(state) => {
                  setEditFormState((prev) => ({ ...prev, ...state }))
                }}
              >
                {({ loading, isEditing, objectData }) => (
                  <InfoCollapse
                    title='Part Information'
                    icon={<InfoCircleIcon />}
                    active={collapseState.info}
                    onToggle={(expanded) =>
                      updateCollapseState('info', expanded)
                    }
                    collapseKey='info'
                  >
                    <ObjectInfo
                      loading={loading}
                      isEditing={isEditing}
                      type='part'
                      objectData={objectData}
                    />
                  </InfoCollapse>
                )}
              </ObjectForm>
              <InfoCollapse
                title='Part SKUs'
                icon={<PartSkuIcon />}
                active={collapseState.partSkus}
                onToggle={(expanded) =>
                  updateCollapseState('partSkus', expanded)
                }
                collapseKey='partSkus'
              >
                {objectFormState.loading ? (
                  <InfoCollapsePlaceholder />
                ) : (
                  <ObjectTable
                    ref={partSkusTableRef}
                    type='partSku'
                    masterFilter={{ part: partId }}
                    visibleColumns={{ part: false }}
                  />
                )}
              </InfoCollapse>
            </ActionHandler>
            <Modal
              open={newPartSkuOpen}
              styles={{ content: { paddingBottom: '24px' } }}
              footer={null}
              width={700}
              onCancel={() => setNewPartSkuOpen(false)}
              destroyOnHidden={true}
            >
              <NewPartSku
                onOk={() => {
                  setNewPartSkuOpen(false)
                  partSkusTableRef.current?.reload?.()
                }}
                reset={newPartSkuOpen}
                defaultValues={{
                  part: objectFormState?.objectData || undefined
                }}
              />
            </Modal>
            <InfoCollapse
              title='Notes'
              icon={<NoteIcon />}
              active={collapseState.notes}
              onToggle={(expanded) => updateCollapseState('notes', expanded)}
              collapseKey='notes'
            >
              <Card>
                <NotesPanel _id={partId} type='part' />
              </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': partId }}
                  visibleColumns={{ _id: false, 'parent._id': false }}
                />
              )}
            </InfoCollapse>
          </Flex>
        </ScrollBox>
      </Flex>
    </>
  )
}

export default PartInfo
