const OSS = require('ali-oss');

const co = require('co');
const path = require('path');
const fs = require('fs');

const cdnpath = `/queenshowv1/`;
const client = new OSS({
    region: 'oss-cn-chengdu',
    accessKeyId: 'LTAI4GHqGdgY3b14jVRTzL2w',
    accessKeySecret: 'AHubozYEzXzi4fBL0ttLJ5sN1HMKA6',
    bucket: 'infishwaibao',
});

function GetSubFiles(dir) {
    return new Promise((reslove, reject) => {
        fs.readdir(dir, function (err, files) {
            reslove(files);
        });
    });
}

async function GetTotalFiles(dir) {
    let subfiles = await GetSubFiles(dir);

    let files = [],
        len = subfiles.length;
    let ret = [];
    for (let i = 0; i < len; i++) {
        let f = subfiles[i];

        let fpath = `${dir}/${f}`;
        var stat = fs.lstatSync(fpath);
        if (!stat.isDirectory()) {
            ret.push(fpath);
        } else {
            let fsubs = await GetTotalFiles(fpath);
            let size = fsubs.length;
            for (let k = 0; k < size; k++) {
                ret.push(fsubs[k]);
            }
        }
    }
    return ret;
}

GetTotalFiles('dist').then((files) => {
    handleFile(files);
});

async function handleFile(files) {
    let i = 0,
        len = files.length;
    for (; i < len; i++) {
        let fpath = files[i];
        if (path.extname(fpath) != '.map') {
            await UploadOss(files[i]);
        }
    }
}

function UploadOss(src) {
    return new Promise((resolve, reject) => {
        co(function* () {
            let fpath = src.substr(5); //去掉前面的dist
            console.log('uploading ' + fpath);

            var ret = yield client.put(cdnpath + fpath, src, { timeout: 2000000 });
            console.log(ret.url);
            let i = 0;
            while (!ret) {
                if (i++ > 3) {
                    reject(`uploading ${src} error!`);
                    return;
                }
                ret = yield client.put(cdnpath + fpath, dist, { timeout: 2000000 });
            }
            console.log(ret.url);

            resolve(ret);
        });
    });
}