'use client'
import { useEffect, useRef, useState } from 'react'
import { useOnClickOutside } from 'usehooks-ts'
import { useMessage } from '@/hooks/useMessage'

/**
 *
 * @param {string} title - 선택 제목 (선택이 없을때 보여질 값)
 * @param {array} options - 선택 옵션 객체 {}
 * @param {function} onChange - 선택 변경 함수
 * @param {object} value - 선택 값 객체 {}
 * @param {boolean} disabled - 선택 비활성화 여부
 * @param {string} sourceKey - options에 있는 키
 * @param {string} targetKey - value에 있는 키
 * @param {string} showKey - options 있는 키중 보여줄 키
 * @param {object} params - 추가 파라미터
 * @returns
 */
export default function QSelectBox({
  title = '',
  options = [],
  onChange,
  value,
  disabled = false,
  sourceKey = '',
  targetKey = '',
  showKey = '',
  params = {},
}) {
  const { getMessage } = useMessage()

  /**
   * 초기 상태 처리
   * useState 초기 값으로 사용해야 해서 useState 보다 위에 작성
   * @returns {string} 초기 상태
   */
  const handleInitState = () => {
    if (options.length === 0) return title !== '' ? title : getMessage('selectbox.title')
    if (showKey !== '' && !value) {
      //value가 없으면 showKey가 있으면 우선 보여준다
      // return options[0][showKey]
      return title !== '' ? title : getMessage('selectbox.title')
    } else if (showKey !== '' && value) {
      //value가 있으면 sourceKey와 targetKey를 비교하여 보여준다

      const option = options.find((option) => {
        return option[sourceKey] === value[targetKey]
      })
      if (!option) {
        return title !== '' ? title : getMessage('selectbox.title')
      } else {
        return option[showKey]
      }
    } else {
      //일치하는 조건이 없으면 기본값을 보여준다.
      return title !== '' ? title : getMessage('selectbox.title')
    }
  }

  const [openSelect, setOpenSelect] = useState(false)
  const [selected, setSelected] = useState(handleInitState())
  const ref = useRef(null)

  const handleClickSelectOption = (option) => {
    setSelected(showKey !== '' ? option[showKey] : option.name)
    onChange?.(option, params)
  }

  const handleClose = () => {
    setOpenSelect(false)
  }

  useEffect(() => {
    // value && handleClickSelectOption(value)
    setSelected(handleInitState())
  }, [options, value, sourceKey, targetKey, showKey])

  useOnClickOutside(ref, handleClose)

  return (
    <div
      className={`sort-select ${openSelect ? 'active' : ''} ${disabled ? 'disabled' : ''}`}
      ref={ref}
      onClick={disabled ? () => {} : () => setOpenSelect(!openSelect)}
    >
      <p>{selected}</p>
      <ul className="select-item-wrap">
        {options?.length > 0 &&
          options?.map((option, index) => (
            <li key={option.id + '_' + index} className="select-item" onClick={() => handleClickSelectOption(option)}>
              <button key={option.id + 'btn'}>{showKey !== '' ? option[showKey] : option.name}</button>
            </li>
          ))}
      </ul>
    </div>
  )
}
