/**
 * @author schukai GmbH
 */

import {Base} from '../types/base.mjs';
import {validateInstance, validateInteger} from "../types/validate.mjs";
import {LogEntry} from "./logentry.mjs";
import {ALL, DEBUG, ERROR, FATAL, INFO, OFF, TRACE, WARN} from "./logger.mjs";

export {Handler}

/**
 * The log handler is the interface between the log entries and the log listeners.
 * 
 * ```
 * <script type="module">
 * import {ID} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@latest/source/logging/handler.mjs';
 * console.log(new Handler())
 * </script>
 * ```
 *
 * @since 1.5.0
 * @copyright schukai GmbH
 * @memberOf Monster.Logging
 */
 class Handler extends Base {
    constructor() {
        super();

        /**
         * Loglevel
         *
         * @type {integer}
         */
        this.loglevel = OFF;
    }

    /**
     * This is the central log function. this method must be
     * overwritten by derived handlers with their own logic.
     *
     * ALL > TRACE > DEBUG > INFO > WARN > ERROR > FATAL > OFF  (ALL = 0xff;OFF = 0x00;
     *
     * @param {LogEntry} entry
     * @returns {boolean}
     */
    log(entry) {
        validateInstance(entry, LogEntry);

        if (this.loglevel < entry.getLogLevel()) {
            return false;
        }

        return true;
    }

    /**
     * set loglevel
     *
     * @param {integer} loglevel
     * @returns {Handler}
     * @since 1.5.0
     */
    setLogLevel(loglevel) {
        validateInteger(loglevel)
        this.loglevel = loglevel;
        return this;
    }

    /**
     * get loglevel
     *
     * @returns {integer}
     * @since 1.5.0
     */
    getLogLevel() {
        return this.loglevel;
    }

    /**
     *  Set log level to All
     *
     * @returns {Handler}
     * @since 1.5.0
     */
    setAll() {
        this.setLogLevel(ALL);
        return this;
    };

    /**
     * Set log level to Trace
     *
     * @returns {Handler}
     * @since 1.5.0
     */
    setTrace() {
        this.setLogLevel(TRACE);
        return this;
    };

    /**
     * Set log level to Debug
     *
     * @returns {Handler}
     * @since 1.5.0
     */
    setDebug() {
        this.setLogLevel(DEBUG);
        return this;
    };

    /**
     * Set log level to Info
     *
     * @returns {Handler}
     * @since 1.5.0
     */
    setInfo() {
        this.setLogLevel(INFO);
        return this;
    };

    /**
     * Set log level to Warn
     *
     * @returns {undefined}
     * @since 1.5.0
     */
    setWarn() {
        this.setLogLevel(WARN);
        return this;
    };

    /**
     * Set log level to Error
     *
     * @returns {Handler}
     * @since 1.5.0
     */
    setError() {
        this.setLogLevel(ERROR);
        return this;
    };

    /**
     * Set log level to Fatal
     *
     * @returns {Handler}
     * @since 1.5.0
     */
    setFatal() {
        this.setLogLevel(FATAL);
        return this;
    };


    /**
     * Set log level to Off
     *
     * @returns {Handler}
     * @since 1.5.0
     */
    setOff() {
        this.setLogLevel(OFF);
        return this;
    };


}