interface LogLevelMap {
    [key: string]: number
}
class Log {
    level: string
    name: string
    constructor({ name = 'niivue', level = 'info' } = {}) {
        this.name = `${name}`
        this.level = level
    }

    // map 'debug' 'info' 'warn' 'error' 'fatal' 'silent' to numbers
    // for comparison
    static levels: LogLevelMap = {
        debug: 0,
        info: 1,
        warn: 2,
        error: 3,
        fatal: 4,
        silent: Infinity
    }

    debug(...args: unknown[]): void {
        if (Log.levels[this.level] > Log.levels.debug) {
            return
        }
        // eslint-disable-next-line
    console.debug(`${this.name}-debug`, ...args)
    }

    info(...args: unknown[]): void {
        if (Log.levels[this.level] > Log.levels.info) {
            return
        }
        // eslint-disable-next-line
    console.info(`${this.name}-info`, ...args)
    }

    warn(...args: unknown[]): void {
        if (Log.levels[this.level] > Log.levels.warn) {
            return
        }
        // eslint-disable-next-line
    console.warn(`${this.name}-warn`, ...args)
    }

    error(...args: unknown[]): void {
        if (Log.levels[this.level] > Log.levels.error) {
            return
        }
        // eslint-disable-next-line
    console.error(`${this.name}-error`, ...args)
    }

    fatal(...args: unknown[]): void {
        if (Log.levels[this.level] > Log.levels.fatal) {
            return
        }
        // eslint-disable-next-line
    console.error(`${this.name}-fatal`, ...args)
    }

    setLogLevel(level: string): void {
        this.level = level
    }

    setName(name: string): void {
        this.name = name
    }
}

// make a log instance and export it
const log = new Log({ name: 'niivue', level: 'info' })
export { log }
