import { Container, Loading } from '@/components/shared'
import { useLocalization } from '@/utils/hooks/useLocalization'
import { DataType } from 'devextreme/common'
import { SimpleItem } from 'devextreme/ui/form'
import { useEffect, useState } from 'react'
import { Helmet } from 'react-helmet'
import { useNavigate, useParams, useSearchParams } from 'react-router-dom'
import FormButtons from './FormButtons'
import FormDevExpress from './FormDevExpress'
import { FormProps } from './types'
import { useGridData } from './useGridData'
import { useCurrentMenuIcon } from '@/utils/hooks/useCurrentMenuIcon'
import { Badge } from '@/components/ui'

const FormNew = (
  props: FormProps = {
    isSubForm: false,
  },
) => {
  const mode = 'new'
  const { isSubForm, level, sParams } = props
  const params = useParams()
  const listFormCode = props?.listFormCode ?? params?.listFormCode ?? ''
  const [searchParams] = useSearchParams()
  const { translate } = useLocalization()
  const MenuIcon = useCurrentMenuIcon('w-5 h-5')
  const navigate = useNavigate()

  const {
    fetchData,
    setFormData,
    loading,
    handleSubmit,
    gridDto,
    dataSource,
    commandColumnData,
    formData,
    formItems,
    refForm,
    permissionResults,
  } = useGridData({
    mode,
    listFormCode,
    level,
    isSubForm,
    onSubmitAction: (props?.onActionView),
  })
  const [newParams, setNewParams] = useState<URLSearchParams>(new URLSearchParams())

  useEffect(() => {
    setNewParams(
      new URLSearchParams({
        ...Object.fromEntries(searchParams),
        ...Object.fromEntries(sParams ?? []),
      }),
    )
  }, [searchParams, sParams])

  useEffect(() => {
    if (!formItems) {
      return
    }

    // Sadece formData yoksa (ilk yüklemede) initial data oluştur
    // Kullanıcının girdiği bilgileri korumak için mevcut formData varsa setleme
    if (!formData) {
      setFormData(createInitialFormData())
    }
  }, [formItems])

  // newParams değiştiğinde sadece newParams'tan gelen alanları güncelle
  useEffect(() => {
    if (!formItems || !formData || !gridDto?.columnFormats) {
      return
    }

    const updatedData = { ...formData }
    let hasChanges = false

    for (const colFormat of gridDto.columnFormats) {
      if (!colFormat.fieldName || !newParams.has(colFormat.fieldName)) {
        continue
      }

      const dType = colFormat.dataType as DataType
      let newValue: any

      switch (dType) {
        case 'date':
        case 'datetime':
          newValue = new Date(newParams.get(colFormat.fieldName)!)
          break
        case 'number':
          newValue = Number(newParams.get(colFormat.fieldName))
          break
        case 'boolean':
          if (newParams.get(colFormat.fieldName) === 'true') {
            newValue = true
          } else if (newParams.get(colFormat.fieldName) === 'false') {
            newValue = false
          }
          break
        case 'object':
          try {
            newValue = JSON.parse(newParams.get(colFormat.fieldName) as string)
          } catch (error) {
            newValue = updatedData[colFormat.fieldName]
          }
          break
        default:
          newValue = newParams.get(colFormat.fieldName)
          break
      }

      if (updatedData[colFormat.fieldName] !== newValue) {
        updatedData[colFormat.fieldName] = newValue
        hasChanges = true
      }
    }

    if (hasChanges) {
      setFormData(updatedData)
    }
  }, [newParams, gridDto?.columnFormats])

  // newParams'tan gelen alanları readonly yap
  useEffect(() => {
    if (!formItems || !gridDto?.columnFormats || !newParams) {
      return
    }

    for (const colFormat of gridDto.columnFormats) {
      if (!colFormat.fieldName || !newParams.has(colFormat.fieldName)) {
        continue
      }

      // Eğer URL'den değer geliyorsa, bu editörü readonly yapıyoruz
      formItems.forEach((form) => {
        form?.items?.forEach((item: SimpleItem) => {
          if (item.dataField === colFormat.fieldName) {
            item.editorOptions = { ...item.editorOptions, readOnly: true }
          }
        })
      })
    }
  }, [formItems, newParams, gridDto?.columnFormats])

  function createInitialFormData() {
    const data: any = {}
    if (!formItems?.length) {
      return data
    }

    // Default tüm alanlar undefined olsun
    for (const formGroupItem of formItems) {
      if (formGroupItem.items) {
        //SimpleItem
        for (const formItem of formGroupItem.items) {
          const f = formItem as SimpleItem
          data[f.dataField!] = undefined
        }
      }
    }

    if (!gridDto?.columnFormats) {
      return data
    }

    // Grid'den gelen columnFormat'ları kullanarak default değerleri set et
    for (const colFormat of gridDto?.columnFormats) {
      if (!colFormat.fieldName) {
        continue
      }

      if (colFormat.defaultValue != null) {
        data[colFormat.fieldName] = colFormat.defaultValue
      }
    }

    return data
  }

  if (!listFormCode) {
    return <></>
  }

  if (loading) {
    return <Loading type="cover" loading={loading}></Loading>
  }

  if (!formData) {
    return <>{translate('::Error:0002')}</>
  }

  return (
    <Container>
      {!isSubForm && (
        <Helmet
          titleTemplate="%s | Sözsoft Kurs Platform"
          title={translate('::' + gridDto?.gridOptions.title)}
          defaultTitle="Sözsoft Kurs Platform"
        ></Helmet>
      )}
      <div
        className={`flex items-center pb-2 px-2 ${isSubForm ? 'justify-end' : 'justify-between'}`}
      >
        <div className="flex items-center gap-2">
          {MenuIcon}
          {!isSubForm && (
            <>
              <h4 className="text-slate-700 text-sm font-medium leading-none">
                {translate('::' + gridDto?.gridOptions?.title)}
              </h4>
              ●
              <Badge content={mode} />
            </>
          )}
        </div>
        {permissionResults && (
          <FormButtons
            isSubForm={isSubForm}
            mode={mode}
            listFormCode={listFormCode}
            id={formData?.Id}
            gridDto={gridDto!}
            commandColumnData={commandColumnData!}
            dataSource={dataSource!}
            permissions={permissionResults}
            handleSubmit={handleSubmit}
            refreshData={() => {}}
            getSelectedRowKeys={() => []}
            getSelectedRowsData={() => [formData]}
            getFilter={() => []}
            onActionView={props?.onActionView}
          />
        )}
      </div>
      <div className="px-2">
        <FormDevExpress
          mode={mode}
          refForm={refForm}
          formData={formData}
          formItems={formItems}
          setFormData={setFormData}
          listFormCode={listFormCode}
        />
      </div>
    </Container>
  )
}

export default FormNew
