_ = require 'lodash'
errors = require '../errors/index'
Request = require './httpHelper'
Promise = require 'bluebird'

class API extends Request
  constructor: ->
    super()
    @version = 'v1'

  make_request: ->
    @option = _.assignIn @option, {
      hostname: @get_and_del_key(@params, 'host') or C.api.v1.host,
      port: @get_and_del_key(@params, 'port') or C.api.v1.port,
      path: C.api.v1.path,
    }

    action = @params.action
    delete @params.action
    appkey = C.api.v1.appkey
    appsecret = C.api.v1.appsecret
    timestamp  = @getUnixTime 8

    stream = "##{appkey}|#{timestamp}|"

    if _.has @params, 'sessionKey'
      stream = "#{stream}#{@params.sessionKey}"
      delete @params.sessionKey
    stream += '|'

    default_key = @get_and_del_key(@params, 'specialDefaultKey') or 'qry'
#    if _.has @params, 'specialDefaultKey'
#      default_key = @params.specialDefaultKey
#      delete @params.specialDefaultKey

    json = {
      reqs: [{
        act: action
        prms: [{
          n: default_key
          f: _.keys(@params).join ','
          v: [_.values(@params)]
        }]
      }]
    }
    jsonStr = JSON.stringify json

    signStr = "#{appkey}|#{timestamp}|#{appsecret}|#{jsonStr}"
    sign = @md5(signStr.toLowerCase()).toLowerCase()
    stream += "#{sign}$#{jsonStr}"

    @option.stream = stream

    super()

  dispose_data: (data) ->
    obj = {
      raw: data
    }
    if data.st isnt 'OK'
      return Promise.reject new errors.ApiError data.msg, data, @version, @action
    rps = data.rps[0]
    if rps.s is 1
      obj.status = true
      obj.data = {}
      _.each rps.r, (row) ->
        keys = row.f.split ','
        obj.data[row.n] = _.map row.v, (v) ->
          _.zipObject keys, v
      obj.msg = ''
    else
      obj.status = false
      obj.data = null
      obj.msg = rps.m
    Promise.resolve obj

module.exports = API