import AwakenDirective from "./AwakenDirective"
import HomePageDirective from "./HomePageDirective"
import CloseMenuDirective from "./CloseMenuDirective/index"
import ByeDirective from "./ByeDirective"
import OpenMenuDirective from "./OpenMenuDirective/index"
import TestDirective from "./TestDirective"

const DirectiveTypes = (process.env.NODE_ENV == "development" ? [TestDirective] : []).concat([
    // AwakenDirective,
    HomePageDirective,
    OpenMenuDirective,
    CloseMenuDirective
])
const AllDirectiveTypes = DirectiveTypes.concat(ByeDirective)

class Directive {
    constructor (options = {}) {
        this.directiveTypes = options.directiveTypes || DirectiveTypes
        this._directiveTypes = this.parseDirectiveTypes();
        this.params = options.params || {}
        this.directives = []
    }

    parseDirectiveTypes () {
        const directiveTypes = [] 
        this.directiveTypes.map(directiveType => {
            this.circlePushDirective(directiveType , directiveTypes)
        })
        return directiveTypes
    }

    circlePushDirective(directiveType, directiveTypes) {
        if(directiveType.beforeLoadDirectives  && directiveType.beforeLoadDirectives.length > 0 ) {
            directiveType.beforeLoadDirectives.map(i => this.circlePushDirective(i, directiveTypes))
        } 
        directiveTypes.push(directiveType)
    }

    parse ({text}) {
        let isHasSuccess = false
        for(let i = 0 ; i < this._directiveTypes.length ; i++) {
            const directive = new this._directiveTypes[i]({text , directives : this.directives, params : this.params})
            if(directive.match()) {
                isHasSuccess = true
                this.directives.push(directive)
                break
            }
        }
        return isHasSuccess ? this.directives.at(-1) : null
    }

    async excute (directive = this.directives.at(-1)) {
        if(!directive) return 
        const data = await directive.excute()
        return data
    }

    destroy () {

    }
}

export default Directive
export {
    DirectiveTypes,
    AllDirectiveTypes
}