import mediaLibrary from '@ohos.multimedia.mediaLibrary';
import hilog from '@ohos.hilog';
const TAG = 'mediaLibrary.ts'
// 媒體的基本關(guān)鍵信息
export type MediaDataType = {
    uri: string, // 路徑
    name: string, // 資源名稱
    mimeType: string, // 資源類型
    relativePath: string, // 相對路徑(所屬公共目錄)
    size: number, // 資源大小
    pixelmap?: any // 資源縮略圖
}
export class mediaManager {
    private media: mediaLibrary.MediaLibrary = null // 媒體庫
    private fetchFileResult: mediaLibrary.FetchFileResult = null // 當(dāng)前媒體結(jié)果集
    private curFileAsset = null // 當(dāng)前媒體結(jié)果
    private curSelectedMediaUrls: Array<string> = null // 當(dāng)前選擇媒體的urls
    // 首先獲取媒體庫實(shí)例
    setMediaLibrary(): Promise<void> {
        return new Promise((res, rej) => {
            this.media = mediaLibrary.getMediaLibrary();
            if (!this.media) {
                hilog.info(0x0001, TAG, 'create mediaLibrary fail')
                rej()
            } 
            res()
        })
    }
    // 獲取IMAGE類型媒體庫
    async getImageAssetSync(): Promise<any> {
        return await this.getAssets(mediaLibrary.MediaType.IMAGE)
    }
    // 獲取VIDEO類型媒體庫
    async getVideoAssetSync(): Promise<any> {
        return await this.getAssets(mediaLibrary.MediaType.VIDEO)
    }
    // 獲取FILE類型媒體庫
    async getFileAssetSync(): Promise<any> {
        return await this.getAssets(mediaLibrary.MediaType.FILE)
    }
    
    async getAssets(MediaType: mediaLibrary.MediaType): Promise<any> {
        if (!this.media) await this.setMediaLibrary()
        return new Promise((res) => {
            //--- FileKey:文件關(guān)鍵信息,這里根據(jù)MEDIA_TYPE選擇媒體
            let fileKeyObj = mediaLibrary.FileKey.MEDIA_TYPE
            let imagesfetchOp = { //--- select選項(xiàng)配置
                selections: fileKeyObj + '= ?',
                selectionArgs: [MediaType.toString()],
            }
            this.media.getFileAssets(imagesfetchOp).then((fetchFileResult) => {
                this.fetchFileResult = fetchFileResult
                hilog.info(0x0001, TAG, "getFileAssets success:" + fetchFileResult.getCount()+' selected')
                res(fetchFileResult.getCount())
            }).catch((err) => {
                hilog.info(0x0001, TAG, "getFileAssets failed:" + err)
            })
        })
    }
    // 釋放結(jié)果集資源
    releaseFetchFileResult(): void {
        // Bug:真機(jī)測試時(shí),此方法(刪除FetchFileResult實(shí)例)會導(dǎo)致手機(jī)內(nèi)媒體資源顯示刷新
        //this.fetchFileResult.close();
    }
    // 釋放媒體庫資源
    release() {
        this.media.release()
    }
    // 從結(jié)果集中獲取指定index的媒體
    async getCertainImageMedia(index: number): Promise<MediaDataType> {
        if (!this.fetchFileResult) await this.getImageAssetSync()
        return new Promise((res) => {
            this.fetchFileResult.getPositionObject(index).then(async (fileAsset) => {
                hilog.info(0x0001, TAG, "getPositionObject successfully:" + JSON.stringify(fileAsset))
                res(await this.handle(fileAsset))
            }).catch((err) => {
                hilog.info(0x0001, TAG, "getPositionObject failed:" + err);
            })
        })
    }
    // 從結(jié)果集中獲取下一個的媒體
    async getNextImageMedia(): Promise<MediaDataType> {
        if (!this.fetchFileResult) await this.getImageAssetSync()
        return new Promise((res, rej) => {
            this.fetchFileResult.getNextObject().then(async (fileAsset) => {
                hilog.info(0x0001, TAG, "getNextObject success:" + JSON.stringify(fileAsset));
                res(await this.handle(fileAsset))
            }).catch((err) => {
                hilog.info(0x0001, TAG, "getNextObject failed:" + err);
            })
        })
    }
    // 媒體結(jié)果處理,返回?cái)?shù)據(jù)
    private handle(fileAsset: mediaLibrary.FileAsset): Promise<MediaDataType> {
        return new Promise(res => {
            fileAsset.getThumbnail((err, pixelmap) => {
                let data: MediaDataType = {
                    uri: fileAsset.uri,
                    name: fileAsset.displayName,
                    mimeType: fileAsset.mimeType,
                    relativePath: fileAsset.relativePath,
                    size: fileAsset.size
                }
                if (!err) {
                    hilog.info(0x0001, TAG, 'mediaLibraryTest : getThumbnail Successful ' + pixelmap)
                    data.pixelmap = pixelmap
                }
                this.curFileAsset = data
                res(data)
            })
        })
    }
    // 拉起相冊選擇
    async startGetMediaSelect(selectedNumber: number): Promise<Array<string>> {
        if (!this.media) await this.setMediaLibrary()
        return new Promise((res, rej) => {
            let option: mediaLibrary.MediaSelectOption = {
                type: "media", //--- 截止目前只支持選擇media,即所有類型的資源
                count: selectedNumber // --- 需要選擇的媒體個數(shù)
            };
            this.media.startMediaSelect(option, (err, value: Array<string>) => { 
                //--- 這里回調(diào)參數(shù)注意要使用"value"命名,否則不生效!
                if (err) {
                    hilog.info(0x0001, TAG, "selecting media err:" + JSON.stringify(err));
                    rej(err)
                }
                hilog.info(0x0001, TAG, "Media resources selected: " + value.length);
                this.curSelectedMediaUrls = value
                res(this.curSelectedMediaUrls)
            })
        })
    }
    // 從index位置開始,拉起相冊預(yù)覽結(jié)果集中的媒體
    startImagePreview(index?: number): Promise<void> {
        return this.media.startImagePreview(this.curSelectedMediaUrls, index || 0)
    }
    
    getCurSelectedMediaUrls(): Array<string> {
        return this.curSelectedMediaUrls
    }
}