import { warning } from '../vc-util/warning'
import type { RcFile } from './interface'

export default (file: RcFile, acceptedFiles: string | string[]) => {
  if (file && acceptedFiles) {
    const acceptedFilesArray = Array.isArray(acceptedFiles)
      ? acceptedFiles
      : acceptedFiles.split(',')
    const fileName = file.name || ''
    const mimeType = file.type || ''
    const baseMimeType = mimeType.replace(/\/.*$/, '')

    return acceptedFilesArray.some((type) => {
      const validType = type.trim()
      // This is something like */*,*  allow all files
      if (/^\*(\/\*)?$/.test(type)) {
        return true
      }

      // like .jpg, .png
      if (validType.charAt(0) === '.') {
        const lowerFileName = fileName.toLowerCase()
        const lowerType = validType.toLowerCase()

        let affixList = [lowerType]
        if (lowerType === '.jpg' || lowerType === '.jpeg') {
          affixList = ['.jpg', '.jpeg']
        }

        return affixList.some((affix) => lowerFileName.endsWith(affix))
      }

      // This is something like a image/* mime type
      if (/\/\*$/.test(validType)) {
        return baseMimeType === validType.replace(/\/.*$/, '')
      }

      // Full match
      if (mimeType === validType) {
        return true
      }

      // Invalidate type should skip
      if (/^\w+$/.test(validType)) {
        warning(false, `Upload takes an invalidate 'accept' type '${validType}'.Skip for check.`)
        return true
      }

      return false
    })
  }
  return true
}
