import * as path from 'path';
import * as fs from 'fs';

/**
 * 兔宝世界webpack构建多文件类库目录配置获取
 */
export class tubaoDir {

    /**结果存储目录 */
    private entryMap: string[] = [];
    /**排除文件类型 */
    private excludeType: string[];
    /**排除文件名字 */
    private excludeName: string[] = [];

    /**
     * 兔宝世界开源webpack多文件类库打包工具目录获取
     * @param {string} path 指定要获取的目录
     * @param {string} excludeType 指定排除文件类型
     * @param {string} excludeName 指定排除文件名字
     */
    public constructor(excludeType: string[] = [], excludeName: string[] = []) {

        this.mapDir = this.mapDir.bind(this);
        this.readDir = this.readDir.bind(this);
        //重置定位作用域
        this.excludeType = excludeType;
        //排除文件类型
        this.excludeName = excludeName;
        //排除文件名字
    }

    /**
     * 读取特定目录
     * @param {string} path 要查询的目录
     * @return {string[]} 返回的目录
     */
    public read(path: string): string[] {
        this.entryMap = [];
        //目录内容置空
        this.readDir(path)
        //遍历目录
        console.log(this.entryMap)
        //结果
        return this.entryMap;
        //返回目录内容
    }

    /**
     * 读取目录
     * @param {string} dir 起步目录位置
     */
    private readDir(dir: string) {

        var files: string[] = fs.readdirSync(dir)
        //文件列表
        if (!files) { console.log(files); return null; }
        //读取目录错误

        for (var key in files) {
            //遍历
            this.mapDir(files[key], dir);
        }

    }


    /**
     * 遍历目录
     * @param {string} fileName 文件名字
     * @param {string} dir 文件所在目录
     */
    private mapDir(fileName: string, dir: string) {
        var allDir: string = path.join(dir, fileName);
        //全部目录位置
        var stats: fs.Stats = fs.statSync(allDir);
        //文件信息

        if (!stats) { console.log('获取文件和目录信息stats获取失败'); return; }

        if (stats.isDirectory()) { //是目录
            this.readDir(allDir);
            //读取目录
        } else if (stats.isFile()) {//是文件
            this.fileDispose(allDir, dir, fileName)
            //处理文件
        }

    }


    /**
     * 文件处理
     * @param {string} allDir 全部目录
     * @param {string} dir 目录
     * @param {string} fileName 文件名字
     */
    private fileDispose(allDir: string, dir: string, fileName: string) {

        if (this.excludeType.includes(path.extname(allDir))) {
            // 排除目录下的指定文件类型
            console.log(`排除文件类型--名字：${allDir}--目录：${allDir}`)
            return
        }
        if (this.excludeName.indexOf(fileName.split('.')[0]) != -1) {
            // 排除目录下的指定文件
            console.log(`排除文件名字--名字：${fileName} 目录：${allDir}`)
            return
        }
        console.log(`已记录文件：${fileName}--目录：${dir}`)
        this.entryMap.push("./"+allDir);
        //结果存储目录
    }
}