import { injectable } from 'inversify';

import * as ESTree from 'estree';

import { TNodeGuard } from '../../../types/node/TNodeGuard';

import { IObfuscatingGuard } from '../../../interfaces/node-transformers/preparing-transformers/obfuscating-guards/IObfuscatingGuard';

import { NodeGuards } from '../../../node/NodeGuards';

@injectable()
export class BlackListObfuscatingGuard implements IObfuscatingGuard {
    /**
     * @type {((node: Node) => boolean)[]}
     */
    private static readonly blackListGuards: TNodeGuard[] = [
        NodeGuards.isUseStrictOperator
    ];

    /**
     * @type {number}
     */
    private readonly blackListGuardsLength: number;

    public constructor () {
        this.blackListGuardsLength = BlackListObfuscatingGuard.blackListGuards.length;
    }

    /**
     * @returns {boolean}
     * @param node
     */
    public check (node: ESTree.Node): boolean {
        for (let i: number = 0; i < this.blackListGuardsLength; i++) {
            if (BlackListObfuscatingGuard.blackListGuards[i](node)) {
                return false;
            }
        }

        return true;
    }
}
