/**
 * Command line script - Operations with Redis database for current app
 * Usage: ubcli redis --help
 *
 * @author pavel.mash
 * @module redis
 * @memberOf module:@unitybase/ubcli
 */
const base = require('@unitybase/base')
const options = base.options
const argv = base.argv

module.exports = function crypt () {
  if (options.switchIndex('?') !== -1 || options.switchIndex('help') !== -1 ||
    options.switchIndex('-help') !== -1) {
    showUsage()
    return
  }

  const serverConfig = argv.getServerConfiguration()
  const rcfg = serverConfig.application.redis
  if (!rcfg || !rcfg.enabled) {
    console.warn('Redis is not enabled for app in config')
    return
  }
  const redis = require('@unitybase/redis')
  const redisConn = new redis.RedisClient(rcfg)

  const [, , , cmd, arg1, arg2] = process.argv
  // const connDesc = `${rcfg.host}:${rcfg.port} DB=${rcfg.dbIndex}`
  if (cmd === 'flush') {
    try {
      redisConn.commands('FLUSHDB')
      console.log('Redis database \'FLUSHDB\': success')
    } catch (e) {
      console.error('Error flushing a Redis database:', e.message)
    }
  } else if (cmd === 'keys') {
    const mask = arg1 || '*'
    const res = redisConn.commands('KEYS', mask)
    console.log(res)
  } else if (cmd === 'get') {
    const key = arg1
    if (!key) throw new Error('usage: ubcli redis get my_key')
    const res = redisConn.commands('GET', key)
    console.log(res)
  } else if (cmd === 'set') {
    const key = arg1
    const val = arg2
    if (!key || !val) throw new Error('usage: ubcli redis set my_key myVal')
    const res = redisConn.commands('SET', key, val)
    console.log(res)
  } else if (cmd === 'del') {
    const key = arg1
    if (!key) throw new Error('usage: ubcli redis del my_key')
    const res = redisConn.commands('DEL', key)
    console.log(res)
  } else {
    console.error(`Unknown command ${cmd}`)
    showUsage()
  }
}
module.exports.shortDoc = 'Operations with Redis database for current app'

/**
 * Display usage
 */
function showUsage () {
  console.log(`
Operations with Redis database for current app

ubcli [-app appName] redis [command] [...args]

Commands:
  flush     flush (remove all data) a Redis database, used by current app
  keys      [mask]
              show all Redis keys if mask is empty, or keys filtered by mask
              Example: ubcli redis keys ub:auth*             
  get       key
              get value for key
              Example: ubcli redis get my_key    
  set       key
              set value for key            
              Example: ubcli redis set my_key "some value"   
  del       key
              remove key from Redis database          
`)
}