/**
 * 마지막 글자 받침체크
 */
function isSingleCharacter(text){
  var strGa = 44032 //가
  var strHih = 55203 //힣
  let lastStrCode = text.charCodeAt(text.length-1)

  if(lastStrCode < strGa || lastStrCode > strHih){
    return false //한글이 아닌 경우
  }
  return ((lastStrCode - strGa) % 28 == 0)
}
/**
 * 를/을 필터
 * @param {*} text 필터 문자열
 * @param {*} filter 필터 조사 neun : 는/은   leul :를/을   ro: 로/으로
 */
function filterCheck(text, filter){
  if(filter == '은' || filter == '는') return text + (isSingleCharacter(text) ? '는' : '은')
  if(filter == '을' || filter == '를') return text + (isSingleCharacter(text) ? '를' : '을')
  if(filter == '으로' || filter == '로') return text + (isSingleCharacter(text) ? '로' : '으로')
  if(filter == '이' || filter == '가') return text + (isSingleCharacter(text) ? '가' : '이')
  if(filter == '과' || filter == '와') return text + (isSingleCharacter(text) ? '와' : '과')
}
/**
 * @param {*} str  원본 문자열
 * @param {*} target 문자열 교체 대상
 * @param {*} filter 필터 조사 neun : 는/은   leul :를/을   ro: 로/으로
 * @returns
 */
function getChangedStr(str, target){
  if(!useUtil.isNull(str)){
    let result = ''
    if(str.includes(target)){
      let targetStr = str.substr(0, target.length+1)   //조사를 변경하기 위해 교체대상의 다음문자까지 가져오기.
      let target2Str = str.substr(0, target.length+2)
      let lastStr = targetStr.substr(-1)
      if(target2Str.substr(-2) === '으로'){
        lastStr = '으로'
        result = str.replace(target2Str, filterCheck(target, lastStr))
      }else{
        result = str.replace(targetStr, filterCheck(target, lastStr))
      }
    }else{
      result = str
    }
    return result
  }
}

/*
* 뷰티파이 유효성 검사
*/
let valid = {
  // 필수입력
  required(fieldName){
    return (value) => !!value || `${getChangedStr(fieldName+'을', fieldName)} 입력하세요.`
  },
  //파일 필수
  requiredFile(value){
    return (input) => !!value || '파일을 첨부해주세요'
  },
  // 셀렉트 필수입력
  requiredSelect(fieldName){
    return (value) => !!value || `${getChangedStr(fieldName+'을', fieldName)} 선택하세요.`
  },
  // 로그인 > 아이디 체크
  loginIdChk(value){
    return /^[a-zA-Z0-9]{5,20}$/.test(value) || false
  },
  // 로그인 > 비밀번호 체크
  loginPwChk(value){
    return /^(?=.*\d|.*[!@#$%^&*()-=_+])[A-Za-z\d!@#$%^&*()-=_+]{8,16}$/i.test(value) || false
  },
  // 아이디
  idRegChk(){
    return (value) => /^[a-zA-Z0-9]{6,20}$/.test(value) || '영문, 숫자 6자리~20자리로 입력하세요.'
  },
  // 비밀번호
  passWordChk(){
    // ^(?=.*[A-Za-z])(?=.*\d)(?=.*[\/\[`~!@#\$%^&\*|\\\'\x22;:\?\=\+_()\<\>\]])[A-Za-z\d\/\[`~!@#\$%^&\*|\\\'\x22;:\?\=\+_\(\)\<\>\]]
    // 영문, 특수문자, 숫자 중 두 종류는 필수로 들어가야함
    // return (value) => /^(?=.*\d|.*[!@#$%^&*()-=_+])[A-Za-z\d!@#$%^&*()-=_+]{8,16}$/i.test(value) || `영문자, 숫자, 특수문자 조합하여 8자리 이상 입력하세요.`
    // 영문, 특수문자, 숫자 중 세 종류는 필수로 들어가야함
    return (value) => /^(?=.*[a-zA-Z])(?=.*[!@#$%^*+=-])(?=.*[0-9]).{8,16}$/i.test(value) || `영문자, 숫자, 특수문자 조합하여 8자리 이상 입력하세요.`
  },
  // 비밀번호
  passWordChk2(){
    return (value) => /^(?=.*\d|.*[!@#$%^&*()-=_+])[A-Za-z\d!@#$%^&*()-=_+]{8,16}$/i.test(value) || `비밀번호를 확인하세요.`
  },
  // 이름
  nameChk(fieldName){
    return (value)=> /^[가-힣a-zA-Z]{2,20}$/.test(value) || `한글, 영문 2자리 ~ 20자리로 입력하세요.`
  },
  // 이메일
  emailChk(){
    return (value)=> /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,50}))$/.test(value) || '이메일을 정확하게 입력하세요.'
  },
  // 동일 비밀번호
  passWordConfirm(target){
    return (value) => (value && value === target) ||'신규 비밀번호와 동일하게 입력하세요.'
  },
  // 전화번호(휴대폰 번호)
  callChk(){
    return (value) => /^0([0-9]{1,2})-?([0-9]{3,4})-?([0-9]{4})$/.test(value) || '휴대폰 번호(전화번호)를 확인하세요.'
  },
  // 휴대폰 번호연락처
  phoneChk(){
    return (value) => /^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/.test(value) || '휴대폰 번호를 확인하세요.'
  },
  // min max
  minMaxChk(min, max){
    return (value) =>  (value.length < min || value.length > max) ? `숫자 ${min}자리 ~ ${max}자리로 입력하세요.` : true
  },
  // max
  maxChk(max){
    return (value) => value.length <= max || `${max}자 이하 입력하세요.`
  },
  // min
  minChk(min){
    return (value) => value.length >= min || `${min}자 이상 입력하세요.`
  },
  // 중복 체크 후 사용 가능한 아이디
  abledChk(result, field){
    return result === false || `사용할 수 없는 ${field}입니다.`
  },
  // 아이디 t/f
  idStrChk(value){
    return /^[a-zA-Z0-9]{6,20}$/.test(value)
  },
  // 이메일 t/f
  emailStrChk(value){
    return /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,50}))$/.test(value)
  },
  // 연락처 t/f
  phoneStrChk(value){
    return /^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/.test(value)
  },
  //faq
  strMinMax(min, max){
    return (value) => (value.length < min || value.length > max) ? `한글, 영문, 특수문자, 숫자 ${min}자리 ~ ${max}자리로 입력하세요.` : true
  },
  // 로그인 > 아이디 찾기 / 비밀번호 재발급 // 이름 한글과 영문 2~20 자리
  loginNameChk(value){
    return /^[가-힣a-zA-Z]{2,10}$/.test(value) || false
  },
  // 시스템 설정 > 관리자 계정 관리 : 이메일(입력칸이 두개로 분리되어있음)
  seperateEmailChk(emailId, emailAddr){
    return this.emailStrChk(emailId + '@' + emailAddr) || '이메일을 정확하게 입력하세요.'
  },
  // 시스템 설정 > 관리자 계정 관리 : 전화번호(입력칸이 새개로 분리되어있음)
  seperateContactChk(contact1, contact2, contact3){
    return this.phoneStrChk(contact1 + '-' + contact2 + '-' + contact3 ) || '숫자 2자리 ~ 11자리로 입력하세요'
  },
  // 필수 입력값 판단
  requiredChk(str, fieldName){
    return str == '' ? `${getChangedStr(fieldName+'을', fieldName)} 입력하세요.` : false
  },
  // 이메일 에러 메시지 생성
  emailErrorStrForChk(emailId, emailAddr){
    return !(/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,50}))$/.test(emailId + '@' + emailAddr)) ? '이메일을 정확하게 입력하세요.' : false
  },
  // 전화번호(휴대폰) 에러 메시지 생성
  contactErrorStrForChk(contact){
    return !(/^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/.test(contact)) ? '숫자 2자리 ~ 11자리로 입력하세요' : false
  },
  // 시스템 설정 > 세대 계정 관리 : 전화번호(ID) 유효성 검사 세팅
  phoneIdChk(){
    return (value) => /^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/.test(value) || '전화번호(ID)를 확인하세요.'
  },
  urlPattern(__VAL){
    const patterUrl = new RegExp(
      "^(https?:\\/\\/)" + // 프로토콜
      "((([a-zA-Z\\d]([a-zA-Z\\d-]*[a-zA-Z\\d])*))\\.)*" + // 서브도메인
      "([a-zA-Z\\d]([a-zA-Z\\d-]*[a-zA-Z\\d])*\\.[a-zA-Z]{2,})" + // 도메인
      "(\\:\\d+)?(\\/[-a-zA-Z\\d%@_.~+&:]*)*" + // 경로
      "(\\?[;&a-zA-Z\\d%@_.,~+&:=-]*)?" + // 쿼리 문자열
      "(\\#[-a-zA-Z\\d_]*)?$" // 앵커
    );
    return patterUrl.text(__VAL);
  }
  // /**
  //  * P5G 추가 validation
  //  * 생성 시 p5g를 앞에 붙여 생성[p5gRequired]
  //  */
  // p5gRequired(fieldName){
  //   let msg = ''
  //   const language = useLangStore().getLang
  //   if(language == 'kr') msg = `${getChangedStr(fieldName+'을', fieldName)} 입력하세요.`
  //   else if(language == 'en') msg = `${fieldName} is required`
  //   return (value) => !!value || msg
  // },
  // p5gNumCheck(num, type) {
  //   let checkNum = num.replace(/[^0-9]/g, '')
  //   if(type === 'otp') {
  //     // OTP키값
  //     if (num !== checkNum) {
  //       num = checkNum
  //     } else if(num.length > 6) {
  //       num = num.slice(0, 6)
  //     }
  //   } else {
  //     // 연락처
  //     let phoneNum = checkNum
  //     if(phoneNum > 11) {
  //       phoneNum = phoneNum.slice(0, 11)
  //     }
  //     // 입력한 숫자를 전화번호 형식으로 변환
  //     if (phoneNum.length > 7) {
  //       // 3자리-4자리-4자리 형식
  //       phoneNum = phoneNum.replace(/(\d{3})(\d{4})(\d{4})/, '$1-$2-$3');
  //     } else if (phoneNum.length > 3) {
  //       // 3자리-4자리 형식
  //       phoneNum = phoneNum.replace(/(\d{3})(\d{4})?/, '$1-$2');
  //     }
      
  //     // 변환된 값을 다시 input에 설정
  //     num = phoneNum
  //   }
  //   return num
  // },
  // /**
  //  * 필수 선택 (0값도 있는값으로 판단)
  //  */
  // p5gRequiredSelect(fieldName) {
  //   const language = useLangStore().getLang
  //   return (value) => {
  //     let isNotNull = value !== '' && value !== null && value !== undefined
  //     let msg = ''
  //     if(language == 'kr') msg = `${getChangedStr(fieldName + '을', fieldName)} 선택하세요.`
  //     else if(language == 'en') msg = `${fieldName} is required select`
  //     return isNotNull ? true : msg
  //   }
  // },
  //  /**
  //  * 필수 선택 (0값도 있는값으로 판단)
  //  */
  //  p5gRequiredSelect(fieldName) {
  //   const language = useLangStore().getLang
  //   return (value) => {
  //     let isNotNull = value !== '' && value !== null && value !== undefined
  //     let msg = ''
  //     if(language == 'kr') msg = `${getChangedStr(fieldName + '을', fieldName)} 선택하세요.`
  //     else if(language == 'en') msg = `${fieldName} is required select`
  //     return isNotNull ? true : msg
  //   }
  // }
}

export default  valid