interface LoggerParams {
  loggerLevel:      number;
  serviceName?:     string;
  machineAddr?:     string;
  port?:            number;
  dateTime?:        Date;
  callFunc:         (text: string) => void;
  isPushToServer:   boolean;
}

const defaultParams = {
  loggerLevel: -1,
  serviceName: '',
  machineAddr: '',
  port: 80,
  dateTime: new Date(),
  callFunc: (text: string) => console.log(text),
  isPushToServer: false
}

const mergeParams = (mainObject = {}, defaultParams: LoggerParams ): LoggerParams => {
  return {...defaultParams, ...mainObject}
}

class Logger {
  private readonly loggerLevel:    number;
  private          serviceName:    string | undefined;
  private          machineAddr:    string | undefined;
  private          port:           number | undefined;
  private          dateTime:       Date | undefined;
  private readonly callFunc:       ((text: string) => void) | undefined;
  private readonly isPushToServer: boolean | undefined;



  constructor(params: LoggerParams) {
    const parsedParams = mergeParams(params, defaultParams)
    this.loggerLevel    = parsedParams.loggerLevel
    this.serviceName    = parsedParams.serviceName
    this.machineAddr    = parsedParams.machineAddr
    this.port           = parsedParams.port
    this.dateTime       = parsedParams.dateTime
    this.callFunc       = parsedParams.callFunc
    this.isPushToServer = parsedParams.isPushToServer
  }

  debug(text: string, level: number) {
    if(!text && !level && !this.isPushToServer) return
    /* Отправляем инфу на сервер
      const data = {serviceInfo: this.params, text: text, level: level}
      axios.post(url, data)
      .then((res) => {
        return res
      })
      .catch((err) => {
        return err
      })
    ... */
    if (this.loggerLevel > level) {
      return this.callFunc ? this.callFunc(text) : 'Отладочная информация отправлена на сервер'
    }
  }
  info(text: string, level: number) {
    if(!text && !level && !this.isPushToServer) return
    /* Отправляем инфу на сервер
      const data = {serviceInfo: this.params, text: text, level: level}
      axios.post(url, data)
      .then((res) => {
        return res
      })
      .catch((err) => {
        return err
      })
    ... */
    if (this.loggerLevel > level) {
      return this.callFunc ? this.callFunc(text) : 'Информация отправлена на сервер'
    }
  }
  warn(text: string, level: number) {
    if(!text && !level && !this.isPushToServer) return
    /* Отправляем инфу на сервер
      const data = {serviceInfo: this.params, text: text, level: level}
      axios.post(url, data)
      .then((res) => {
        return res
      })
      .catch((err) => {
        return err
      })
    ... */
    if (this.loggerLevel > level) {
      return this.callFunc ? this.callFunc(text) : 'Предупреждение отправлено на сервер'
    }
  }
  error(text: string, level: number) {
    if(!text && !level && !this.isPushToServer) return
    /* Отправляем инфу на сервер
      const data = {serviceInfo: this.params, text: text, level: level}
      axios.post(url, data)
      .then((res) => {
        return res
      })
      .catch((err) => {
        return err
      })
    ... */
    if (this.loggerLevel > level) {
      return this.callFunc ? this.callFunc(text) : 'Ошибка отправлена на сервер'
    }
  }
}

export default Logger