const winston = require('winston')
const expressWinston = require('express-winston')
const Transport = require('winston-transport')

class FirebaseTransport extends Transport {
  constructor(options) {
    super(options)
    this._db = options.db
  }

  async log(info, callback) {
    try {
      await this._db.ref(`log-${new Date().getTime()}`).set(info)
      callback(null, info)
      this.emit('logged', info)
    } catch (err) {
      callback(err)
      this.emit('error', err)
    }

    return info
  }
}

const createRouteLogger = ({ db }) => {
  return expressWinston.logger({
    transports: [
      new FirebaseTransport({ db })
    ],
    format: winston.format.combine(
      winston.format.timestamp(),
      winston.format.json()
    ),
    meta: true,
    expressFormat: true,
  })
}

const createErrorLogger = ({ db }) => {
  return expressWinston.errorLogger({
    transports: [
      new FirebaseTransport({ db })
    ],
    format: winston.format.combine(
      winston.format.timestamp(),
      winston.format.json()
    ),
  })
}

const createAppLogger = ({ db }) => {
  return winston.createLogger({
    format: winston.format.combine(
      winston.format.timestamp(),
      winston.format.json()
    ),
    transports: [
      new FirebaseTransport({ db }),
      new winston.transports.Console(),
    ]
  })
}

module.exports = {
  createRouteLogger,
  createErrorLogger,
  createAppLogger,
}