/**
 * 下载工具类
 * 提供跨平台的文件下载功能，支持H5和原生平台
 */

/**
 * 文件下载选项接口
 */
export interface DownloadOptions {
    /** 文件下载URL */
    url: string
    /** 文件名 */
    fileName?: string
    /** 文件类型 */
    fileType?: string
    /** 文件大小 */
    fileSize?: string
    /** 是否显示下载进度 */
    showProgress?: boolean
}

/**
 * 下载结果接口
 */
export interface DownloadResult {
    /** 是否成功 */
    success: boolean
    /** 错误信息 */
    error?: string
    /** 文件保存路径（仅原生平台） */
    savedFilePath?: string
}

/**
 * H5平台下载文件
 * @param options 下载选项
 * @returns Promise<DownloadResult>
 */
export function downloadFileForWeb(options: DownloadOptions): Promise<DownloadResult> {
    return new Promise((resolve) => {
        const { url, fileName = 'download' } = options

        try {
            // 检查是否在浏览器环境
            if (typeof document === 'undefined') {
                resolve({
                    success: false,
                    error: 'H5下载功能仅支持浏览器环境',
                })
                return
            }

            // 创建一个临时的a标签用于下载
            const link = document.createElement('a')
            link.href = url
            link.download = fileName
            link.style.display = 'none'

            // 添加到文档并触发点击
            document.body.appendChild(link)
            link.click()

            // 清理
            document.body.removeChild(link)

            // 显示下载成功提示
            uni.showToast({
                title: '开始下载',
                icon: 'success',
                duration: 1500,
            })

            resolve({
                success: true,
            })
        } catch (error) {
            console.error('H5下载失败:', error)
            resolve({
                success: false,
                error: 'H5下载失败',
            })
        }
    })
}

/**
 * 原生平台下载文件
 * @param options 下载选项
 * @returns Promise<DownloadResult>
 */
export function downloadFileForNative(options: DownloadOptions): Promise<DownloadResult> {
    return new Promise((resolve) => {
        const { url, fileName = 'download', fileType = '', showProgress = true } = options

        if (showProgress) {
            // 显示加载提示
            uni.showLoading({
                title: '下载中...',
                mask: true,
            })
        }

        uni.downloadFile({
            url,
            success: (res) => {
                if (res.statusCode === 200) {
                    uni.saveFile({
                        tempFilePath: res.tempFilePath,
                        success: (saveRes) => {
                            if (showProgress) {
                                uni.hideLoading()
                                uni.showToast({
                                    title: '下载成功',
                                    icon: 'success',
                                    duration: 1500,
                                })
                            }

                            // 提示用户文件已保存
                            uni.showModal({
                                title: '下载完成',
                                content: `文件已保存至: ${saveRes.savedFilePath}\n是否立即打开？`,
                                success: (modalRes) => {
                                    if (modalRes.confirm) {
                                        uni.openDocument({
                                            filePath: saveRes.savedFilePath,
                                            fileType: fileType?.toString() || '',
                                            showMenu: true,
                                            fail: () => {
                                                uni.showToast({
                                                    title: '无法打开文件',
                                                    icon: 'none',
                                                    duration: 1500,
                                                })
                                            },
                                        })
                                    }
                                },
                            })

                            resolve({
                                success: true,
                                savedFilePath: saveRes.savedFilePath,
                            })
                        },
                        fail: (err) => {
                            if (showProgress) {
                                uni.hideLoading()
                                console.error('保存文件失败:', err)
                                uni.showToast({
                                    title: '保存文件失败',
                                    icon: 'none',
                                    duration: 1500,
                                })
                            }
                            resolve({
                                success: false,
                                error: '保存文件失败',
                            })
                        },
                    })
                } else {
                    if (showProgress) {
                        uni.hideLoading()
                        uni.showToast({
                            title: `下载失败，状态码: ${res.statusCode}`,
                            icon: 'none',
                            duration: 1500,
                        })
                    }
                    resolve({
                        success: false,
                        error: `下载失败，状态码: ${res.statusCode}`,
                    })
                }
            },
            fail: (err) => {
                if (showProgress) {
                    uni.hideLoading()
                    console.error('下载失败:', err)
                    uni.showToast({
                        title: '网络错误，下载失败',
                        icon: 'none',
                        duration: 1500,
                    })
                }
                resolve({
                    success: false,
                    error: '网络错误，下载失败',
                })
            },
        })
    })
}

/**
 * 通用下载文件方法
 * 自动判断平台并调用相应的下载方法
 * @param options 下载选项
 * @returns Promise<DownloadResult>
 */
export function downloadFile(options: DownloadOptions): Promise<DownloadResult> {
    // 判断是否为H5平台
    /* #ifdef H5 */
    return downloadFileForWeb(options)
    /* #endif */

    // 其他平台使用原生下载
    /* #ifndef H5 */
    return downloadFileForNative(options)
    /* #endif */
}

/**
 * 便捷下载方法，支持资源对象
 * @param resource 资源对象，包含 fileSrc、fileName、fileType 等属性
 * @returns Promise<DownloadResult>
 */
export function downloadResource(resource: any): Promise<DownloadResult> {
    const options: DownloadOptions = {
        url: resource.fileSrc,
        fileName: resource.fileName || 'download',
        fileType: resource.fileType || '',
        fileSize: resource.fileSize || '',
        showProgress: true,
    }

    return downloadFile(options)
}

/**
 * 检查下载链接是否有效
 * @param url 下载链接
 * @returns Promise<boolean>
 */
export function checkDownloadUrl(url: string): Promise<boolean> {
    return new Promise((resolve) => {
        // 在原生平台检查链接有效性
        /* #ifndef H5 */
        uni.request({
            url,
            method: 'HEAD',
            success: (res) => {
                resolve(res.statusCode === 200)
            },
            fail: () => {
                resolve(false)
            },
        })
        /* #endif */

        // 在H5平台，直接返回true（浏览器会处理链接有效性）
        /* #ifdef H5 */
        resolve(true)
        /* #endif */
    })
}
