

/**
 * UTC时间字符串转为北京时间
 * @param {*} utcStr 2025-05-15T02:16:27.000+00:00
 * @param {*} type 是否返回后缀时分秒，默认true返回
 * @returns 2025-05-15 10:16:27
 */
export function convertUTCToBeijing(utcStr, type = true) {
    if (utcStr) {
        const date = new Date(utcStr);

        // 北京时间 = UTC 时间
        date.setHours(date.getHours());

        const pad = (n) => String(n).padStart(2, '0');
        const y = date.getFullYear();
        const m = pad(date.getMonth() + 1);
        const d = pad(date.getDate());
        const hh = pad(date.getHours());
        const mm = pad(date.getMinutes());
        const ss = pad(date.getSeconds());

        const time = `${y}-${m}-${d} ${hh}:${mm}:${ss}`
        const dateday = `${y}-${m}-${d}`

        return type ? time : dateday;

    } else {
        return utcStr
    }
}

/**
 * 获取当前时间或今日 0 点时间（本地）
 * @param {'date' | 'ISO' | 'zone' | 'now' | 'utc'} type 返回格式类型
 * - date: 今日日期（默认）
 * - ISO: 今日 0 点 ISO 字符串，含时区偏移（默认）
 * - zone: 今日 0 点字符串，格式为 "YYYY-MM-DD 00:00:00"
 * - now: 当前时间字符串 "YYYY-MM-DD HH:mm:ss"
 * - utc: 当前 UTC ISO 格式（new Date().toISOString()）
 * @returns string
 */
export function getTodayRangeLocal(type) {
    const now = new Date()
    const start = new Date(now.getFullYear(), now.getMonth(), now.getDate())

    const offset = -start.getTimezoneOffset()
    const sign = offset >= 0 ? '+' : '-'
    const pad = (n) => String(Math.floor(Math.abs(n))).padStart(2, '0')
    const timezone = `${sign}${pad(offset / 60)}:${pad(offset % 60)}`

    const yyyy = start.getFullYear()
    const mm = String(start.getMonth() + 1).padStart(2, '0')
    const dd = String(start.getDate()).padStart(2, '0')
    const hh = String(now.getHours()).padStart(2, '0')
    const mi = String(now.getMinutes()).padStart(2, '0')
    const ss = String(now.getSeconds()).padStart(2, '0')

    const date = `${yyyy}-${mm}-${dd}` //当前日期
    const timeISOZone = `${yyyy}-${mm}-${dd}T00:00:00${timezone}`  // 今日 0 点带时区
    const timeZone = `${yyyy}-${mm}-${dd} 00:00:00`                 // 今日 0 点普通格式
    const timeNow = `${yyyy}-${mm}-${dd} ${hh}:${mi}:${ss}`        // 当前时间
    const ISO = now.toISOString()                                   // 当前 UTC 时间

    switch (type) {
        case 'zone':
            return timeZone
        case 'now':
            return timeNow
        case 'utc':
            return ISO
        case 'ISO':
            return timeISOZone
        default:
            return date
    }
}


/**
 * 转成小写字符
 * userStatus 转成 user_status
 * @param {*} str 
 * @returns 
 */
export function camelToSnake(str) {
    return str.replace(/([A-Z])/g, '_$1').toLowerCase();
}


/**
 * 将 base64 转为 Blob
 * @param {*} base64 base64数据
 * @returns 
 */
export function base64ToBlob(base64) {
    const arr = base64.split(',')
    const mime = arr[0].match(/:(.*?);/)[1]
    const bstr = atob(arr[1])
    let n = bstr.length
    const u8arr = new Uint8Array(n)
    while (n--) {
        u8arr[n] = bstr.charCodeAt(n)
    }
    return new Blob([u8arr], { type: mime })
}

/**
 * 保留小数位
 * @param {*} value 输入值
 * @param {number} place 保留小数位，默认2位
 * @param {boolean} type 返回类似 true-number，false-string，默认false
 * @returns {string | number} 默认返回string 0.00
 */
export function roundPrice(value, place = 2, type = false) {
    const num = Number(value)
    if (isNaN(num)) return (0).toFixed(place)
    return type ? Number(num.toFixed(place)) : num.toFixed(place)
}

/**
 * 获取设置信息
 * @returns 
 */
export function getUserEnvInfo() {
    const ua = navigator.userAgent

    // 操作系统判断
    let os = 'Unknown'
    if (/Windows/i.test(ua)) os = 'Windows'
    else if (/Mac OS/i.test(ua)) os = 'macOS'
    else if (/Android/i.test(ua)) os = 'Android'
    else if (/iPhone|iPad|iPod/i.test(ua)) os = 'iOS'
    else if (/Linux/i.test(ua)) os = 'Linux'

    // 浏览器判断
    let browser = 'Unknown'
    if (/Edg\//i.test(ua)) browser = 'Edge'
    else if (/Chrome/i.test(ua)) browser = 'Chrome'
    else if (/Safari/i.test(ua) && !/Chrome/i.test(ua)) browser = 'Safari'
    else if (/Firefox/i.test(ua)) browser = 'Firefox'
    else if (/MSIE|Trident/i.test(ua)) browser = 'IE'

    // 网络类型（部分浏览器支持）
    const connection = navigator.connection || navigator.webkitConnection || navigator.mozConnection
    const networkType = connection?.effectiveType || 'Unknown'

    // 是否移动端
    const isMobile = /Android|iPhone|iPad|iPod/i.test(ua)

    return {
        os,
        browser,
        networkType,
        isMobile
    }
}

export function formatDateFull (dateStr){
    // 创建Date对象
    const date = new Date(dateStr);
    
    // 获取年、月、日
    const year = date.getFullYear();
    const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始，需+1
    const day = String(date.getDate()).padStart(2, '0');
    
    // 获取时、分、秒
    const hours = String(date.getHours()).padStart(2, '0');
    const minutes = String(date.getMinutes()).padStart(2, '0');
    const seconds = String(date.getSeconds()).padStart(2, '0');
    
    // 拼接成目标格式
    return dateStr? `${year}-${month}-${day} ${hours}:${minutes}:${seconds}` : '--';
}