import { DispatchCountEnum, DispatchEnum, UseConditionEnum, UseGoodsEnum } from '@/enums/modeEnum'
import type { UploadFile } from 'element-plus'

/*
 * @Author: micky 1254597151@qq.com
 * @Date: 2023-08-14 15:56:31
 * @LastEditors: micky 1254597151@qq.com
 * @LastEditTime: 2024-01-09 16:32:58
 * @FilePath: \housekeeping-admin\src\utils\validate.ts
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
const mobileReg = /^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[189]))\d{8}$/

const integerReg = /^\+?[1-9]\d*$/
const positiveNumberReg = /^(?!0+(?:\.0+)?$)(?:[1-9]\d*|0)(?:\.\d{1,2})?$/

const positiveNumberAndZeroReg = /^(0|[1-9]\d*)(\.\d{1,2})?$/
const idCardReg = /^[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[\dXx]$/
const ageReg = /^(?:1[0-5][0-9]|[1-9][0-9]|[1-9])$/

/**
 * @param {string} path
 * @returns {Boolean}
 */
export function isExternal(path: string) {
    return /^(https?:|mailto:|tel:)/.test(path)
}

/**手机号码 */
export function validateContact(rule: any, value: any, callback: any) {
    if (value) {
        if (!mobileReg.test(value)) {
            callback(new Error('请输入正确的手机号'))
        } else {
            callback()
        }
    } else {
        callback()
    }
}
/**分销抽佣比 */
export function validateCommissionRate(args, payload: string) {
    const [, value, callback] = args
    if (value && positiveNumberAndZeroReg.test(value)) {
        if (parseFloat(value) <= 20) {
            callback()
        } else {
            callback(new Error(`${payload}抽佣比范围在0-20%`))
        }
    } else {
        callback(new Error(`${payload}抽佣比请输入正数，且最多保留两位小数`))
    }
}

/**分销码有效期 */
export function validateEffectTime(args, payload: any) {
    const [, value, callback] = args
    if (!payload.validEndTime) {
        callback('请选择日期')
    } else if (payload.validEndTime < payload.validStartTime) {
        callback('结束日期不能小于开始日期')
    } else {
        callback()
    }
}
/**分销抽佣比、师傅服务金额 */
export function validateServiceCommissionRate(args, payload: string, max: number) {
    const [, value, callback] = args
    if (positiveNumberAndZeroReg.test(value)) {
        if (parseFloat(value) <= max) {
            callback()
        } else {
            callback(new Error(`${payload}抽佣比范围在0-${max}%`))
        }
    } else {
        callback(new Error(`${payload}抽佣比请输入正数，且最多保留两位小数`))
    }
}

// 全数字
export function isNumber(path: string) {
    return /^\d+$/.test(path)
}
// 带小数点的数字
export function isNumberWithDot(path: string) {
    return /^(?!0\.00$)(?:0|[1-9]\d*)(?:\.\d{1,2})?$/.test(path)
}

/**优惠券的校验规则 */
/**优惠券面值 */
export function validateMoney(args: any, payload: any[]) {
    const [, value, callback] = args
    const [conditionType, conditionMoney] = payload
    if (value && positiveNumberReg.test(value)) {
        if (conditionType === UseConditionEnum.CONDITION) {
            if (parseFloat(value) > parseFloat(conditionMoney)) {
                callback(new Error('优惠值面额必须小于最低消费金额'))
            } else {
                callback()
            }
        } else {
            callback()
        }
    } else {
        callback(new Error('优惠面值请输入正数，但不包含0且最多保留两位小数'))
    }
}
/**发放方式渠道派发 */
export function validateUserList(args: any, payload: number, channel: number) {
    const [, value, callback] = args
    if (payload === DispatchEnum.CHANNEL_DISPATCH) {
        const val = value[channel]
        if (!Array.isArray(val) || !val.length) {
            callback(new Error('请选择赠送对象'))
        } else {
            callback()
        }
    } else {
        callback()
    }
}
/**品类券 */
export function validateServiceCategory(args: any, payload: number) {
    const [, value, callback] = args
    if (payload === UseGoodsEnum.CATEGORY) {
        if (!value.length) {
            callback(new Error('请选择商品品类'))
        } else {
            callback()
        }
    } else {
        callback()
    }
}
/**商品券 */
export function validateGoodsList(args: any, payload: number) {
    const [, value, callback] = args
    if (payload === UseGoodsEnum.CATEGOYR_PART) {
        if (!value.length) {
            callback(new Error('请选择商品'))
        } else {
            callback()
        }
    } else {
        callback()
    }
}
/**有门槛 */
export function valdiateConditionMoney(args: any, payload: number[]) {
    const [, value, callback] = args
    const [conditionType, money] = payload
    if (conditionType === UseConditionEnum.CONDITION) {
        if (!value) {
            callback(new Error('请输入最低消费金额，但不包含0'))
        } else if (positiveNumberReg.test(value)) {
            if (money && parseFloat(value) < parseFloat(money)) {
                callback(new Error('最低消费金额必须大于优惠券面值'))
            } else {
                callback()
            }
        } else {
            callback(new Error('最低消费金额请输入正数，但不包含0且最多保留两位小数'))
        }
    } else {
        callback()
    }
}
/**限量 */
export function validateDispatchCount(args: any, payload: number[]) {
    const [, value, callback] = args
    const [sendTotalType, getType] = payload
    if (getType == DispatchEnum.SYSTEM_GIVE) return callback()
    if (sendTotalType === DispatchCountEnum.COUNT) {
        if (!value) {
            callback(new Error('请输入发放数量，但不包含0'))
        } else if (integerReg.test(value)) {
            callback()
        } else {
            callback(new Error('请输入正整数，但不包含0'))
        }
    } else {
        callback()
    }
}
/**用户可领取数量 */
export function validateGetNum(args: any, payload: number[]) {
    const [, value, callback] = args
    const [sendTotalType, dispatchCount] = payload
    if (value && integerReg.test(value)) {
        if (sendTotalType === DispatchCountEnum.COUNT && dispatchCount && value > dispatchCount) {
            callback(new Error('用户领取数量必须小于发放数量'))
        } else {
            callback()
        }
    } else {
        callback(new Error('请输入正整数，但不包含0'))
    }
}
/**发放时间 */
export function validateSendTime(args: any, payload: number[]) {
    const [, value, callback] = args
    const [sendTimeStart, sendTimeEnd, useTimeStart, useTimeEnd] = payload
    if (!sendTimeStart || !sendTimeEnd) {
        callback(new Error('请选择发放时间'))
    } else if (sendTimeStart === sendTimeEnd) {
        callback(new Error('结束时间不能等于开始时间'))
    } else if ((useTimeStart && sendTimeStart > useTimeStart) || (useTimeEnd && sendTimeEnd > useTimeEnd)) {
        callback(new Error('发放时间的开始时间应该小于使用时间的开始时间，发放时间的结束时间应该小于使用时间的结束时间'))
    } else {
        callback()
    }
}
/**使用时间 */
export function validateUseTime(args: any, payload: number[]) {
    const [, value, callback] = args
    const [useTimeStart, useTimeEnd, sendTimeStart, sendTimeEnd] = payload
    if (!useTimeStart || !useTimeEnd) {
        callback(new Error('请选择使用时间'))
    } else if (useTimeStart === useTimeEnd) {
        callback(new Error('结束时间不能等于开始时间'))
    } else if ((useTimeStart && sendTimeStart > useTimeStart) || (useTimeEnd && sendTimeEnd > useTimeEnd)) {
        callback(new Error('使用时间的开始时间应该大于发放时间的开始时间，使用时间的结束时间应该大于发放时间的结束时间'))
    } else {
        callback()
    }
}

// 服务时间格式校验
export function validateGoodsTime(args: any) {
    const [, value, callback] = args
    if (!/^\+?[1-9]\d*$/.test(value)) {
        callback(new Error('请输入正整数，但不包含0'))
    } else {
        callback()
    }
}
/**身份证号 */
export function validateIdCard(rule: any, value: any, callback: any) {
    if (value === '') {
        callback(new Error('请输入身份证号'))
    } else if (!idCardReg.test(value)) {
        callback(new Error('身份证号格式有误'))
    } else {
        callback()
    }
}
/**服务类别 */
export function validateGoodsIds(rule: any, value: any, callback: any) {
    if (!value.length) {
        callback(new Error('请选择服务类别'))
    } else {
        callback()
    }
}
/**身份证照片 */
export function validateFileUploadList(args: any, payload: Record<string, UploadFile[]>) {
    const [, , callback] = args
    if (!payload.idCard.length) {
        callback(new Error('请上传身份证正反面照片'))
    } else if (payload.idCard.length < 2) {
        callback(new Error('请上传2张身份证照片'))
    } else {
        callback()
    }
}
/**师傅全身照 */
export function validateAvatarUploadList(args: any, payload: Record<string, UploadFile[]>) {
    const [, , callback] = args
    if (!payload.avatar.length) {
        callback(new Error('请上传全身照'))
    } else {
        callback()
    }
}
/**所在地区 */
export function validateLocation(args: any, payload: Record<string, any>) {
    const [, , callback] = args
    const { provinceId, cityId, districtId } = payload
    if (provinceId === '' && cityId === '' && districtId === '') {
        callback(new Error('请选择所在地区'))
    } else {
        callback()
    }
}

export function validateAge(rule: any, value: any, callback: any) {
    if (value === '') {
        callback(new Error('请输入年龄'))
    } else if (!ageReg.test(value)) {
        callback(new Error('请输入正确的年龄'))
    } else {
        callback()
    }
}
// 运营师傅工作时间
export function validateWorkTime(args: any, value: any) {
    const [, , callback] = args
    if (!value.workStartTime || !value.workEndTime) {
        callback('请选择工作时间')
    } else if (value.workStartTime > value.workEndTime) {
        callback('结束时间不能小于开始时间')
    } else {
        callback()
    }
}
/**重新指派师傅-扣分 */
export function validateScore(rule: any, value: any, callback: any) {
    const reg = /^\d+(\.\d{1,2})?$/
    if (value) {
        if (value < 0 || value > 5) {
            callback(new Error('最小0分，最大5分'))
        } else if (!/^[0-9]\d*(\.\d+)?$/.test(value)) {
            callback(new Error('请输入正数'))
        } else if (!reg.test(value)) {
            callback(new Error('请输入正数，最多保留2位小数'))
        } else {
            callback()
        }
    }
}
/**体检报告 */
export function validateFiles(args, payload: any) {
    const [, value, callback] = args
    const { pdf, report } = payload
    if (report.length == 0 && pdf.length == 0) {
        callback(new Error('请上传体检报告'))
    } else {
        callback()
    }
}
/**扣款比例 */
export function validateValue(rule: any, value: any, callback: any) {
    const _reg = /[^\d.]/g //移除特殊字符
    const zeroReg = /^0+(\d+)/ //连续输入多个0
    const precisionReg = /(\.\d\d)\d+$/ //最多保留2位小数
    const _reg2 = /^\./ //点开头
    const _reg3 = /(\.\d*\.)/g //连续输入多个小数点，只保留一个

    if (value === '') {
        callback(new Error('请输入退款比例'))
    } else {
        const parsedValue = parseFloat(value)
        if (parsedValue < 0 || parsedValue > 100) {
            callback(new Error('扣款比例范围在0-100'))
        } else if (_reg.test(value)) {
            callback(new Error('不能输入特殊字符'))
        } else if (zeroReg.test(value)) {
            callback(new Error('不能连续输入多个0'))
        } else if (precisionReg.test(value)) {
            callback(new Error('最多保留2位小数'))
        } else if (_reg2.test(value)) {
            callback(new Error('不能输入以点开头字符'))
        } else if (_reg3.test(value)) {
            callback(new Error('不能连续输入多个小数点'))
        } else {
            callback()
        }
    }
}
