const UB = require('@unitybase/ub')

/* global ubs_message_recipient */
ubs_message_recipient.entity.addMethod('insert')
ubs_message_recipient.entity.addMethod('acceptMessage')
ubs_message_recipient.entity.addMethod('acceptAllMessages')

/**
 * Hook for backward compatibility.
 * When someone custom code trys to insert new recipient into ubs_message_recipient
 * this insert will be redirected to ubs_message_acl entity.
 *
 * !!!Should be deleted after all customers refactor their code!!!!
 *
 * @param ctx
 */
ubs_message_recipient.insert = function insert (ctx) {
  const { messageID, userID, acceptDate } = ctx.mParams.execParams
  if (!acceptDate) {
    UB.DataStore('ubs_message_acl').run('insert', {
      execParams: {
        instanceID: messageID,
        subjID: userID
      },
      __skipAclRls: true
    })
    ctx.preventDefault()
  }
}

/**
 * Mark message with specified messageID as read by recipient (current logged-in user)
 *
 * @function acceptMessage
 * @memberOf ubs_message_recipient_ns.prototype
 * @memberOfModule @unitybase/ubs
 * @published
 * @param {ubMethodParams} ctx
 * @param {number} ctx.mParams.execParams.ID
 */
ubs_message_recipient.acceptMessage = function (ctx) {
  const execParams = ctx.mParams.execParams
  if (!execParams || !execParams.messageID) {
    throw new Error('Invalid value of parameter messageID')
  }

  ctx.mParams.resultData = UB.DataStore('ubs_message_recipient').run('insert', {
    fieldList: ['ID'],
    execParams: {
      messageID: execParams.messageID,
      userID: UB.Session.userID,
      acceptDate: new Date()
    }
  })
}

/**
 * Mark all non-expired unread messages for the current logged in user as read
 *
 * @function acceptAllMessages
 * @memberOf ubs_message_recipient_ns.prototype
 * @memberOfModule @unitybase/ubs
 * @published
 */
ubs_message_recipient.acceptAllMessages = () => {
  // query via `ubs_message` to add filter by complete,startDate automatically
  const recipientMessageIds = UB.Repository('ubs_message')
    .attrs('ID')
    .where('expireDate', '>', new Date())
    .notExists(UB.Repository('ubs_message_recipient')
      .correlation('messageID', 'ID')
      .where('userID', '=', UB.Session.userID)
    )
    .selectAsArrayOfValues()

  if (recipientMessageIds.length === 0) {
    return
  }

  for (const ID of recipientMessageIds) {
    global.ubs_message_recipient.acceptMessage({
      mParams: {
        execParams: {
          messageID: ID
        }
      }
    })
  }
}