import resolve from '@rollup/plugin-node-resolve'
import commonjs from '@rollup/plugin-commonjs'
import bundles from './build/index'
import fs from 'fs'
import path from 'path'
import buble from '@rollup/plugin-buble'
import json from "@rollup/plugin-json"
import image from '@rollup/plugin-image'

function searchImages(dir, images) {
    const files = fs.readdirSync(dir)
    files.forEach((item, index) => {
        var fullPath = path.join(dir, item)
        const stat = fs.statSync(fullPath)
        if (stat.isDirectory()) {
            searchImages(path.join(dir, item), images)
        } else {
            if (fullPath.endsWith('.png')) {
                images.push(fullPath)
            }
        }
    })
    return images
}

const allImages = []
searchImages('src', allImages)

function mkdirsSync(dirname) {
    if (fs.existsSync(dirname)) {
        return true
    } else {
        if (mkdirsSync(path.dirname(dirname))) {
            fs.mkdirSync(dirname)
            return true
        }
    }
}

allImages.forEach((value) => {
    let path = __dirname + '/build/' + value
    path = path.split("\\").join("/")
    let index = path.lastIndexOf('/')
    mkdirsSync(path.substring(0, index))

    fs.copyFile(__dirname + '/' + value, __dirname + '/build/' + value, error => {
        if (error)
            console.log(error)
    })
})


function readDirs(dirPath, files) {
    if (fs.statSync(dirPath).isDirectory()) {
        fs.readdirSync(dirPath).forEach(e => {
            readDirs(path.join(dirPath, e), files)
        })
    } else {
        for (let bundle of bundles) {
            if (dirPath.replace("\\", "/").match(new RegExp(`^${bundle}`))) {
                files.push(dirPath)
            }
        }
    }
}


const dirs = fs.readdirSync('.')
    .filter(e => {
        for (let bundle of bundles) {
            if (bundle.match(new RegExp(`^${e}/`))) {
                return true
            }
        }
        return false
    })

const allFiles = []

dirs.forEach(e => {
    readDirs(e, allFiles)
})
export default
    allFiles
        .map(e => e.replace('.ts', ''))
        .map(bundle => {
            return {
                input: `build/${bundle}.js`,
                output: {
                    format: "cjs",
                    file: `bundle/${bundle}.js`,
                    sourcemap: true,
                },
                plugins: [
                    resolve({ mainFields: ["jsnext"] }),
                    commonjs(),
                    json(),
                    image(),
                ],
                external: ['reflect-metadata', 'doric'],
                onwarn: function (warning) {
                    if (warning.code === 'THIS_IS_UNDEFINED') { return }
                    console.warn(warning.message)
                }
            }
        }).concat(
            allFiles
                .map(e => e.replace('.ts', ''))
                .map(bundle => {
                    return {
                        input: `build/${bundle}.js`,
                        output: {
                            format: "cjs",
                            file: `bundle/${bundle}.es5.js`,
                            sourcemap: true,
                        },
                        plugins: [
                            resolve({ mainFields: ["jsnext"] }),
                            commonjs(),
                            json(),
                            buble({
                                transforms: {
                                    dangerousForOf: true,
                                    generator: false,
                                }
                            }),
                            image(),
                        ],
                        external: ['reflect-metadata', 'doric'],
                        onwarn: function (warning) {
                            if (warning.code === 'THIS_IS_UNDEFINED') { return }
                            console.warn(warning.message)
                        }
                    }
                }))