/*
 * SPDX-FileCopyrightText: 2021 The HedgeDoc developers (see AUTHORS file)
 *
 * SPDX-License-Identifier: AGPL-3.0-only
 */

import { DateTime } from 'luxon'

export enum LogLevel {
  DEBUG = 'debug',
  INFO = 'info',
  WARN = 'warn',
  ERROR = 'error'
}

type OutputFunction = (...data: unknown[]) => void

/**
 * Simple logger that prefixes messages with a timestamp and a name
 */
export class Logger {
  private readonly scope: string

  constructor(scope: string) {
    this.scope = scope
  }

  /**
   * Logs a debug message
   * @param data data to log
   */
  debug(...data: unknown[]): void {
    this.log(LogLevel.DEBUG, ...data)
  }

  /**
   * Logs a normal informative message
   * @param data data to log
   */
  info(...data: unknown[]): void {
    this.log(LogLevel.INFO, ...data)
  }

  /**
   * Logs a warning
   * @param data data to log
   */
  warn(...data: unknown[]): void {
    this.log(LogLevel.WARN, ...data)
  }

  /**
   * Logs an error
   * @param data data to log
   */
  error(...data: unknown[]): void {
    this.log(LogLevel.ERROR, ...data)
  }

  private log(loglevel: LogLevel, ...data: unknown[]) {
    const preparedData = [...this.prefix(), ...data]
    const logOutput = Logger.getLogOutput(loglevel)
    logOutput(...preparedData)
  }

  private static getLogOutput(logLevel: LogLevel): OutputFunction {
    switch (logLevel) {
      case LogLevel.INFO:
        return console.info
      case LogLevel.DEBUG:
        return console.debug
      case LogLevel.ERROR:
        return console.error
      case LogLevel.WARN:
        return console.warn
    }
  }

  private prefix(): string[] {
    const timestamp = DateTime.now().toFormat('yyyy-MM-dd HH:mm:ss')
    return [`%c[${timestamp}] %c(${this.scope})`, 'color: yellow', 'color: orange']
  }
}
