import log4js from 'log4js'
import chalk from 'chalk'
class Log {
  public name: Error | string = new Error('abstrct attribute')
  public type: Error | string = new Error('abstrct attribute')
  public level: Error | string = new Error('abstrct attribute')
  public silent: boolean = false
  public regist () {
    log4js.configure({
      appenders: { [this.name as string]: { type: this.type as string, filename: `${this.name as string}.log` } },
      categories: { default: { appenders: [this.name as string], level: this.level as string } }
    })
  }
  public get logger () {
    if (this._logger) return this._logger
    return (this._logger = log4js.getLogger())
  }
  private _logger: any
  public info (msg: string) {
    this.logger.info(msg)
    if (this.silent) return
    console.info(msg)
  }
  public error (msg: string) {
    this.logger.error(msg)
    if (this.silent) return
    console.error(chalk.red(msg))
  }
  public warn (msg: string) {
    this.logger.warn(msg)
    if (this.silent) return
    console.warn(chalk.yellow(msg))
  }
  public debug (msg: string) {
    this.logger.debug(msg)
    if (this.silent) return
    console.debug(msg)
  }
  public trace (msg: string) {
    this.logger.trace(msg)
    if (this.silent) return
    console.trace(msg)
  }
}

export class InterfaceLog extends Log {
  public name: string = 'interface'
  constructor(public type: string = 'file', public level: string = 'error', public silent: boolean = false) {
    super()
    this.regist()
  }
}
