import { request, uploadFile } from '../base'
import type { ResultDomain, TbSysFileDTO, FileUploadParam, BatchFileUploadParam } from '../../types'
import { BASE_URL } from '../../config'

export const fileAPI = {
    baseUrl: '/urban-lifeline/file',

    /**
     * 上传单个文件（uni-app 版本）
     * @param filePath 文件临时路径
     * @param param 文件上传参数
     * @param originalFileName 原始文件名（可选，用于保存正确的文件名）
     * @returns Promise<ResultDomain<TbSysFileDTO>>
     */
    uploadFile(filePath: string, param?: FileUploadParam, originalFileName?: string): Promise<ResultDomain<TbSysFileDTO>> {
        return uploadFile<TbSysFileDTO>({
            url: `${this.baseUrl}/upload`,
            filePath: filePath,
            name: 'file',
            formData: {
                module: param?.module || '',
                optsn: param?.optsn || '',
                uploader: param?.uploader || '',
                fileName: originalFileName || ''
            }
        })
    },

    /**
     * 批量上传文件（uni-app 版本）
     * @param filePaths 文件临时路径数组
     * @param param 批量文件上传参数
     * @returns Promise<ResultDomain<TbSysFileDTO>>
     */
    async batchUploadFiles(filePaths: string[], param?: BatchFileUploadParam): Promise<ResultDomain<TbSysFileDTO>> {
        const uploadPromises = filePaths.map(filePath => 
            this.uploadFile(filePath, param)
        )
        
        try {
            const results = await Promise.all(uploadPromises)
            // 返回包含所有上传文件的结果
            const uploadedFiles = results
                .filter((r: ResultDomain<TbSysFileDTO>) => r.success && r.data)
                .map((r: ResultDomain<TbSysFileDTO>) => r.data!)
            
            return {
                success: true,
                dataList: uploadedFiles
            } as ResultDomain<TbSysFileDTO>
        } catch (error) {
            return {
                success: false,
                message: '批量上传失败'
            } as ResultDomain<TbSysFileDTO>
        }
    },

    /**
     * 获取文件信息
     * @param fileId 文件ID
     * @returns Promise<ResultDomain<TbSysFileDTO>>
     */
    getFileById(fileId: string): Promise<ResultDomain<TbSysFileDTO>> {
        return request<TbSysFileDTO>({ url: `${this.baseUrl}/${fileId}`, method: 'GET' })
    },

    /**
     * 获取文件下载 URL
     * @param fileId 文件ID
     * @returns string
     */
    getDownloadUrl(fileId: string): string {
        return `${BASE_URL}${this.baseUrl}/download/${fileId}`
    }
}