import React, { useState, useRef } from 'react'
import { useLocation } from 'react-router-dom'
import { Space, Flex, Card } from 'antd'
import loglevel from 'loglevel'
import config from '../../../../config.js'
import useCollapseState from '../../hooks/useCollapseState.js'
import NotesPanel from '../../common/NotesPanel.jsx'
import InfoCollapse from '../../common/InfoCollapse.jsx'
import ViewButton from '../../common/ViewButton.jsx'
import NoteIcon from '../../../Icons/NoteIcon.jsx'
import EditObjectForm from '../../common/EditObjectForm.jsx'
import EditButtons from '../../common/EditButtons.jsx'
import LockIndicator from '../../common/LockIndicator.jsx'
import ActionHandler from '../../common/ActionHandler.jsx'
import ObjectActions from '../../common/ObjectActions.jsx'

import TemplateEditor from '../../common/TemplateEditor.jsx'

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

const DocumentTemplateDesign = () => {
  const location = useLocation()
  const editFormRef = useRef(null)
  const actionHandlerRef = useRef(null)
  const documentTemplateId = new URLSearchParams(location.search).get(
    'documentTemplateId'
  )
  const [collapseState, updateCollapseState] = useCollapseState(
    'DocumentTemplateDesign',
    {
      preview: true,
      editor: true,
      notes: true,
      auditLogs: true
    }
  )

  const [editFormState, setEditFormState] = useState({
    isEditing: false,
    editLoading: false,
    formValid: false,
    locked: false,
    loading: false
  })

  const actions = {
    reload: () => {
      editFormRef?.current.handleFetchObject()
      return true
    },
    edit: () => {
      editFormRef?.current.startEditing()
      return false
    },
    cancelEdit: () => {
      editFormRef?.current.cancelEditing()
      return true
    },
    finishEdit: () => {
      editFormRef?.current.handleUpdate()
      return true
    }
  }

  return (
    <Flex
      gap='large'
      vertical='true'
      style={{
        height: 'calc(var(--unit-100vh) - 155px)',
        minHeight: 0
      }}
    >
      <Flex justify={'space-between'}>
        <Space size='middle'>
          <Space size='small'>
            <ObjectActions
              type='documentTemplate'
              id={documentTemplateId}
              disabled={editFormState.loading}
              visibleActions={{ edit: false }}
            />
            <ViewButton
              disabled={editFormState.loading}
              items={[
                {
                  key: 'preview',
                  label: 'Preview'
                },
                {
                  key: 'editor',
                  label: 'Editor'
                },
                { key: 'notes', label: 'Notes' },
                { key: 'auditLogs', label: 'Audit Logs' }
              ]}
              visibleState={collapseState}
              updateVisibleState={updateCollapseState}
            />
          </Space>
          <LockIndicator lock={editFormState.lock} />
        </Space>
        <Space>
          <EditButtons
            isEditing={editFormState.isEditing}
            handleUpdate={() => {
              actionHandlerRef.current.callAction('finishEdit')
            }}
            cancelEditing={() => {
              actionHandlerRef.current.callAction('cancelEdit')
            }}
            startEditing={() => {
              actionHandlerRef.current.callAction('edit')
            }}
            editLoading={editFormState.editLoading}
            formValid={editFormState.formValid}
            disabled={editFormState.lock?.locked || editFormState.loading}
            loading={editFormState.editLoading}
          />
        </Space>
      </Flex>

      <div style={{ height: '100%', overflowY: 'scroll' }}>
        <Flex vertical gap={'large'}>
          <ActionHandler
            actions={actions}
            loading={editFormState.loading}
            ref={actionHandlerRef}
          >
            <EditObjectForm
              id={documentTemplateId}
              type='documentTemplate'
              style={{ height: '100%' }}
              ref={editFormRef}
              onStateChange={(state) => {
                console.log('Got edit form state change', state)
                setEditFormState((prev) => ({ ...prev, ...state }))
              }}
            >
              {({ loading, isEditing, objectData }) => {
                return (
                  <TemplateEditor
                    objectData={objectData}
                    loading={loading}
                    style={{ height: '72vh' }}
                    collapseState={collapseState}
                    isEditing={isEditing}
                  />
                )
              }}
            </EditObjectForm>
          </ActionHandler>
          <InfoCollapse
            title='Notes'
            icon={<NoteIcon />}
            active={collapseState.notes}
            onToggle={(expanded) => updateCollapseState('notes', expanded)}
            collapseKey='notes'
          >
            <Card>
              <NotesPanel _id={documentTemplateId} type='documentTemplate' />
            </Card>
          </InfoCollapse>
        </Flex>
      </div>
    </Flex>
  )
}

export default DocumentTemplateDesign
