import { IImageManager, ILeaferImageConfig, ILeaferImage, IExportFileType, IMultimediaType } from '@leafer/interface'
import { Creator, Platform } from '@leafer/platform'
import { FileHelper, Resource } from '@leafer/file'


export const ImageManager: IImageManager = {

    maxRecycled: 10,

    recycledList: [],

    patternTasker: Resource.queue, // 全局按顺序执行的任务队列，防止阻塞主线程

    get(config: ILeaferImageConfig, type?: IMultimediaType): ILeaferImage {
        let image: ILeaferImage = Resource.get(config.url)
        if (!image) Resource.set(config.url, image = type === 'film' ? Creator.film(config) : Creator.image(config))
        image.use++
        return image
    },

    recycle(image: ILeaferImage): void {
        if (image.parent) image = image.parent // 存在 image filters 的情况
        image.use--
        setTimeout(() => {
            if (!image.use) {
                if (Platform.image.isLarge(image)) {
                    if (image.url) Resource.remove(image.url)
                } else {
                    image.clearLevels()
                    I.recycledList.push(image)
                }
            }
        })
    },

    // maybe rewrite
    recyclePaint(paint: any): void {
        I.recycle(paint.image)
    },

    clearRecycled(force?: boolean): void {
        const list = I.recycledList
        if (list.length > I.maxRecycled || force) {
            list.forEach(image => ((!image.use || force) && image.url) && Resource.remove(image.url))
            list.length = 0
        }
    },

    // need rewrite
    clearLevels(): void { },

    hasAlphaPixel(config: ILeaferImageConfig): boolean {
        return FileHelper.alphaPixelTypes.some(item => I.isFormat(item, config))
    },

    isFormat(format: IExportFileType, config: ILeaferImageConfig): boolean {
        if (config.format) return config.format === format
        const { url } = config
        if (url.startsWith('data:')) {
            if (url.startsWith('data:' + FileHelper.mimeType(format))) return true
        } else {
            if (url.includes('.' + format) || url.includes('.' + FileHelper.upperCaseTypeMap[format])) return true
            else if (format === 'png' && !url.includes('.')) return true // blob: 等无后缀名协议的图片无法分析类型，直接当透明图片处理
        }
        return false
    },

    destroy(): void {
        this.clearRecycled(true)
    }

}

const I = ImageManager