/************************
 *    import
 ************************/
const useErrorHandler = () => {
  const { $log, $toast, $eventBus } = useNuxtApp()

  // 공통 에러코드
  let errProfiles = [
    { code : '9999' , action : 0, desc : '기타오류', proc : {type:'toast',msg:'처리중 오류가 발생되었습니다.<br/> 지속발생시 관리자에게 문의 바랍니다.'}, after : null}
  ]
  let errObj = { code : '' , action : 0, desc : '', proc : {type:'toast',msg:'처리중 오류가 발생되었습니다.<br/>상세오류코드: '}, after : null}
  
  /**
   * 공통 에러 처리 함수
   * @param {*} error 에러
   */
  async function fnSetCommErrorHandle(error){
    let code = ''
    let msg = ''

    if (error.response){
      code = error.response.data.resCode
      msg = error.response.data.resMsg
    }

    //$log.error('[ErrorHandle][ERROR]' + JSON.stringify(error.response.data))

    if(code === '1005' || code === '1006' || code === '1007' || code === '1008') {
      // 1005: 토큰이 없음, 1006: 토큰 만료됨, 1007: 잘못된 토큰 값, 1008: 로그아웃 처리된 토큰 값 => 강제 로그인 페이지로 이동
      $eventBus.emit('SESSION_DESTORY')
    }

    // 에러로 처리
    errObj.code = code

    if(_isEmpty(errObj.code)){
      errObj = _find(errProfiles, {code:'9999'})
      code = '9999'
    }

    if(errObj.proc.type === 'toast'){
      let toastMsg = errObj.proc.msg
      toastMsg = errObj.proc.msg.concat(msg+'['+code+']')
      //$toast.error(toastMsg)
    }

    return false
  }
  // 새로운 포괄적 에러 처리 함수들 추가
  const handleApiError = (error, context = '') => {
    console.error(`API 오류 [${context}]:`, error)
    
    let errorMessage = '서버 오류가 발생했습니다.'
    
    if (error.response) {
      const status = error.response.status
      const data = error.response.data
      
      switch (status) {
        case 400:
          errorMessage = data?.message || '잘못된 요청입니다.'
          break
        case 401:
          errorMessage = '인증이 필요합니다. 다시 로그인해주세요.'
          $eventBus.emit('SESSION_DESTORY')
          break
        case 403:
          errorMessage = '접근 권한이 없습니다.'
          break
        case 404:
          errorMessage = '요청한 리소스를 찾을 수 없습니다.'
          break
        case 422:
          errorMessage = data?.message || '입력 데이터를 확인해주세요.'
          break
        case 429:
          errorMessage = '요청이 너무 많습니다. 잠시 후 다시 시도해주세요.'
          break
        case 500:
          errorMessage = '서버 내부 오류가 발생했습니다.'
          break
        default:
          errorMessage = data?.message || `서버 오류가 발생했습니다. (${status})`
      }
    } else if (error.request) {
      errorMessage = '네트워크 오류가 발생했습니다. 인터넷 연결을 확인해주세요.'
    } else {
      errorMessage = error.message || '알 수 없는 오류가 발생했습니다.'
    }
    
    $toast.error(errorMessage)
    
    return {
      message: errorMessage,
      status: error.response?.status,
      data: error.response?.data
    }
  }

  const handleValidationError = (errors) => {
    if (Array.isArray(errors)) {
      errors.forEach(error => {
        $toast.error(error)
      })
    } else if (typeof errors === 'object') {
      Object.values(errors).forEach(error => {
        if (Array.isArray(error)) {
          error.forEach(msg => $toast.error(msg))
        } else {
          $toast.error(error)
        }
      })
    } else {
      $toast.error(errors || '입력 데이터를 확인해주세요.')
    }
  }

  const handleFileError = (error, fileName = '') => {
    const prefix = fileName ? `[${fileName}] ` : ''
    
    if (error.name === 'FileSizeError') {
      $toast.error(`${prefix}파일 크기가 너무 큽니다. (최대 10MB)`)
    } else if (error.name === 'FileTypeError') {
      $toast.error(`${prefix}지원하지 않는 파일 형식입니다.`)
    } else if (error.name === 'FileReadError') {
      $toast.error(`${prefix}파일을 읽는 중 오류가 발생했습니다.`)
    } else {
      $toast.error(`${prefix}파일 처리 중 오류가 발생했습니다.`)
    }
  }

  const showConfirmDialog = (title, message, onConfirm, onCancel = null) => {
    const param = {
      id: 'confirmDialog',
      title: title,
      content: message,
      yes: {
        text: "확인",
        isProc: true,
        event: "CONFIRM_DIALOG_YES",
        param: null,
      },
      no: {
        text: "취소",
        isProc: false,
        event: "CONFIRM_DIALOG_NO",
        param: null,
      },
    }
    
    // 이벤트 리스너 정리 후 재등록
    $eventBus.off("CONFIRM_DIALOG_YES")
    $eventBus.off("CONFIRM_DIALOG_NO")
    
    $eventBus.on("CONFIRM_DIALOG_YES", () => {
      if (onConfirm) onConfirm()
      $eventBus.off("CONFIRM_DIALOG_YES")
      $eventBus.off("CONFIRM_DIALOG_NO")
    })
    
    $eventBus.on("CONFIRM_DIALOG_NO", () => {
      if (onCancel) onCancel()
      $eventBus.off("CONFIRM_DIALOG_YES")
      $eventBus.off("CONFIRM_DIALOG_NO")
    })
    
    $eventBus.emit("OPEN_CONFIRM_POP_UP", param)
  }

  return { 
    fnSetCommErrorHandle,
    handleApiError,
    handleValidationError,
    handleFileError,
    showConfirmDialog
  }
}

export default useErrorHandler
