import React, { useContext } from 'react'
import { useLocation } from 'react-router-dom'
import { Space, Flex, Card } 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 EditObjectForm from '../../common/EditObjectForm'
import EditButtons from '../../common/EditButtons'
import LockIndicator from '../../common/LockIndicator.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 { ApiServerContext } from '../../context/ApiServerContext'

const PartInfo = () => {
  const location = useLocation()
  const partId = new URLSearchParams(location.search).get('partId')

  const { fetchObjectContent } = useContext(ApiServerContext)

  const [collapseState, updateCollapseState] = useCollapseState('PartInfo', {
    info: true,
    parts: true,
    notes: true,
    auditLogs: true
  })

  return (
    <EditObjectForm
      id={partId}
      type='part'
      style={{ height: 'calc(var(--unit-100vh) - 155px)', minHeight: 0 }}
    >
      {({
        loading,
        isEditing,
        startEditing,
        cancelEditing,
        handleUpdate,
        formValid,
        objectData,
        editLoading,
        lock,
        fetchObject
      }) => {
        const actions = {
          reload: () => {
            fetchObject()
            return true
          },
          edit: () => {
            startEditing()
            return false
          },
          cancelEdit: () => {
            cancelEditing()
            return true
          },
          finishEdit: () => {
            handleUpdate()
            return true
          },
          download: () => {
            if (partId) {
              fetchObjectContent(partId, 'part', `${objectData.name}.stl`)
              return true
            }
          }
        }
        return (
          <ActionHandler actions={actions} loading={loading}>
            {({ callAction }) => (
              <Flex
                gap='large'
                vertical='true'
                style={{ height: '100%', minHeight: 0 }}
              >
                <Flex justify={'space-between'}>
                  <Space size='middle'>
                    <Space size='small'>
                      <ObjectActions
                        type='part'
                        id={partId}
                        disabled={loading}
                      />
                      <ViewButton
                        disabled={loading}
                        items={[
                          { key: 'info', label: 'Part Information' },
                          { key: 'notes', label: 'Notes' },
                          { key: 'auditLogs', label: 'Audit Logs' }
                        ]}
                        visibleState={collapseState}
                        updateVisibleState={updateCollapseState}
                      />
                    </Space>
                    <LockIndicator lock={lock} />
                  </Space>
                  <Space>
                    <EditButtons
                      isEditing={isEditing}
                      handleUpdate={() => {
                        callAction('finishEdit')
                      }}
                      cancelEditing={() => {
                        callAction('cancelEdit')
                      }}
                      startEditing={() => {
                        callAction('edit')
                      }}
                      editLoading={editLoading}
                      formValid={formValid}
                      disabled={lock?.locked || loading}
                      loading={editLoading}
                    />
                  </Space>
                </Flex>

                <div style={{ height: '100%', overflow: 'auto' }}>
                  <Flex vertical gap={'large'}>
                    <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>

                    <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'
                    >
                      {loading ? (
                        <InfoCollapsePlaceholder />
                      ) : (
                        <ObjectTable
                          type='auditLog'
                          masterFilter={{ 'parent._id': partId }}
                          visibleColumns={{ _id: false, 'parent._id': false }}
                        />
                      )}
                    </InfoCollapse>
                  </Flex>
                </div>
              </Flex>
            )}
          </ActionHandler>
        )
      }}
    </EditObjectForm>
  )
}

export default PartInfo
