import { useLocation } from 'react-router-dom'
import { Space, Flex, Card } from 'antd'
import useCollapseState from '../../hooks/useCollapseState'
import EditObjectForm from '../../common/EditObjectForm'
import ObjectInfo from '../../common/ObjectInfo'
import ObjectTable from '../../common/ObjectTable'
import ObjectActions from '../../common/ObjectActions'
import ViewButton from '../../common/ViewButton'
import EditButtons from '../../common/EditButtons'
import ActionHandler from '../../common/ActionHandler'
import InfoCollapse from '../../common/InfoCollapse'
import NotesPanel from '../../common/NotesPanel'
import LockIndicator from '../../common/LockIndicator'
import InfoCircleIcon from '../../../Icons/InfoCircleIcon'
import FilamentStockIcon from '../../../Icons/FilamentStockIcon'
import NoteIcon from '../../../Icons/NoteIcon'
import AuditLogIcon from '../../../Icons/AuditLogIcon'
import InfoCollapsePlaceholder from '../../common/InfoCollapsePlaceholder'

const FilamentStockInfo = () => {
  const location = useLocation()
  const filamentStockId = new URLSearchParams(location.search).get(
    'filamentStockId'
  )
  const [collapseState, updateCollapseState] = useCollapseState(
    'FilamentStockInfo',
    {
      info: true,
      events: true,
      notes: true,
      auditLogs: true
    }
  )

  return (
    <EditObjectForm
      id={filamentStockId}
      type='filamentStock'
      style={{ height: 'calc(var(--unit-100vh) - 155px)', minHeight: 0 }}
    >
      {({
        loading,
        isEditing,
        formValid,
        objectData,
        editLoading,
        lock,
        fetchObject
      }) => {
        const actions = {
          reload: () => {
            fetchObject()
            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='filamentStock'
                        id={filamentStockId}
                        disabled={loading}
                      />
                      <ViewButton
                        disabled={loading}
                        items={[
                          { key: 'info', label: 'Filament Stock Information' },
                          { key: 'events', label: 'Filament Stock Events' },
                          { 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={true}
                      loading={editLoading}
                    />
                  </Space>
                </Flex>

                <div style={{ height: '100%', overflow: 'auto' }}>
                  <Flex vertical gap={'large'}>
                    <InfoCollapse
                      title='Filament Stock Information'
                      icon={<InfoCircleIcon />}
                      active={collapseState.info}
                      onToggle={(expanded) =>
                        updateCollapseState('info', expanded)
                      }
                      collapseKey='info'
                    >
                      <ObjectInfo
                        loading={loading}
                        isEditing={isEditing}
                        type='filamentStock'
                        objectData={objectData}
                      />
                    </InfoCollapse>

                    <InfoCollapse
                      title='Filament Stock Events'
                      icon={<FilamentStockIcon />}
                      active={collapseState.events}
                      onToggle={(expanded) =>
                        updateCollapseState('events', expanded)
                      }
                      collapseKey='events'
                    >
                      {loading ? (
                        <InfoCollapsePlaceholder />
                      ) : (
                        <ObjectTable
                          type='stockEvent'
                          masterFilter={{ 'parent._id': filamentStockId }}
                          visibleColumns={{ 'parent._id': false }}
                        />
                      )}
                    </InfoCollapse>

                    <InfoCollapse
                      title='Notes'
                      icon={<NoteIcon />}
                      active={collapseState.notes}
                      onToggle={(expanded) =>
                        updateCollapseState('notes', expanded)
                      }
                      collapseKey='notes'
                    >
                      <Card>
                        <NotesPanel
                          _id={filamentStockId}
                          type='filamentStock'
                        />
                      </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': filamentStockId }}
                          visibleColumns={{ _id: false, 'parent._id': false }}
                        />
                      )}
                    </InfoCollapse>
                  </Flex>
                </div>
              </Flex>
            )}
          </ActionHandler>
        )
      }}
    </EditObjectForm>
  )
}

export default FilamentStockInfo
