import { EventListeners } from "models/Events";
import { Invokable } from "models/Invokable";

declare global {
    interface HelperOptions {
        removeNewLineFromLogicalSyntax?: boolean;
        removeWhitespaceFromLogicalSyntax?: boolean;
        max?: Number;
        offset?: Number;
        newlineToHtml?: boolean;
        preserveNonMatching?: boolean;
    }
    interface BlockofCode {
        id: String;
        block: String;
        body: String;
        code: String;
    }
    interface TemplateTagConfig {
        IGNORE_CHARS: String[];
        AND: {
            syntax: RegExp
        };
        FOR: {
            begin: RegExp;
            end: RegExp;
            helper: (code: String, body: String, options: HelperOptions) => string;
            parser: (code: String, oobj: any, bind: any, options: HelperOptions) => string;
        };
        FOREACH: {
            begin: RegExp;
            end: RegExp;
            helper: (code: String, body: String, rtnObject: any, uid: String, obj: BlockofCode, bind: any, ref_obj: any) => string;
            parser: (code: String, ref_obj: any, bind: any) => string;
        };
        WHILE: {
            begin: RegExp;
            end: RegExp;
            helper: (code: String, body: String) => string;
            parser: (code: String, ref_obj: any, bind: any) => string;
        };
        IF: {
            begin: RegExp;
            elseif: RegExp;
            else: RegExp;
            end: RegExp;
            helper: (code: String) => string;
            parser: (code: String, oobj: any, bind: any) => string;
        };
        OR: {
            syntax: RegExp
        };
        SWITCH: {
            begin: RegExp;
            case: RegExp;
            default: RegExp;
            break: RegExp;
            end: RegExp;
            helper: (code: String) => string;
            parser: (code: String, oobj: any, bind: any) => string;
        };
        SCRIPT: {
            begin: RegExp;
            end: RegExp;
            parser: (code: String, obj: any, bind: any) => string;
        };
        TRY: {
            begin: RegExp;
            catch: RegExp;
            finally: RegExp;
            end: RegExp;
            helper: (code: String, exec?: any) => string;
            parser: (code: String, oobj: any, bind: any) => string;
        };
        VARIABLE: RegExp;
        VARIABLE_NAME: RegExp | ((match: String) => string);
        DECLARE: {
            syntax: RegExp;
            parser: (htmlTemplate: String, declare: String) => string;
        }
    }
    interface Craydent {
        __listeners: { [key: string]: Array<EventListeners> };
        VERSION: string;
        DEBUG_MODE: boolean;
        ERROR_TYPES: any[]
        MODULES_LOADED: { [key: string]: string };
        CONSOLE_COLORS: {
            RED: string;
            GREEN: string;
            YELLOW: string;
        };
        LOCAL_IP: string;
        PUBLIC_IP: string;
        // TEMPLATE_VARS: Array<TemplateVar>
        TEMPLATE_VARS: Array<any>;
        TEMPLATE_TAG_CONFIG: TemplateTagConfig;
        RESPONSES: {
            [key: number]: {
                status: number;
                success: boolean;
                message: string;
            }
        };
        // HTTP_STATUS_TEMPLATE: Array<HTTPStatusTemplate>
        HTTP_STATUS_TEMPLATE: { [key: number]: string };
        REST_API_TEMPLATE: string;
        ROUTE_API_PATH: string;
        ROUTE_LOGO_URL: string;
        EXPOSE_ROUTE_API: boolean;
        VERBOSE_LOGS: boolean;
        globalize: () => void;
        name: string;
        navigator: Navigator;
        events: EventTarget;
    }
}