const bodyParser = require('body-parser')

const FragmentsInvitations = app => {
  app.use(bodyParser.json())
  const basePath =
    '/api/collections/:collectionId/fragments/:fragmentId/invitations'
  const routePath = './routes/fragmentsInvitations'
  const authBearer = app.locals.passport.authenticate('bearer', {
    session: false,
  })
  /**
   * @api {post} /api/collections/:collectionId/fragments/:fragmentId/invitations Invite a user to a fragment
   * @apiGroup FragmentsInvitations
   * @apiParam {collectionId} collectionId Collection id
   * @apiParam {fragmentId} fragmentId Fragment id
   * @apiParamExample {json} Body
   *    {
   *      "email": "email@example.com",
   *      "role": "reviewer", [acceptedValues: reviewer]
   *    }
   * @apiSuccessExample {json} Success
   *    HTTP/1.1 200 OK
   *   {
   *     "id": "7b2431af-210c-49f9-a69a-e19271066ebd",
   *     "role": "reviewer",
   *     "userId": "4c3f8ee1-785b-4adb-87b4-407a27f652c6",
   *     "hasAnswer": false,
   *     "invitedOn": 1525428890167,
   *     "isAccepted": false,
   *     "respondedOn": null
   *    }
   * @apiErrorExample {json} Invite user errors
   *    HTTP/1.1 403 Forbidden
   *    HTTP/1.1 400 Bad Request
   *    HTTP/1.1 404 Not Found
   *    HTTP/1.1 500 Internal Server Error
   */
  app.post(
    basePath,
    authBearer,
    require(`${routePath}/post`)(app.locals.models),
  )
  /**
   * @api {get} /api/collections/:collectionId/fragments/:fragmentId/invitations/[:invitationId]?role=:role List fragment invitations
   * @apiGroup FragmentsInvitations
   * @apiParam {id} collectionId Collection id
   * @apiParam {id} fragmentId Fragment id
   * @apiParam {id} [invitationId] Invitation id
   * @apiParam {String} role The role to search for: reviewer
   * @apiSuccessExample {json} Success
   *    HTTP/1.1 200 OK
   *    [{
   *      "name": "John Smith",
   *     "invitedOn": 1525428890167,
   *     "respondedOn": 1525428890299,
   *      "email": "email@example.com",
   *      "status": "pending",
   *      "invitationId": "1990881"
   *    }]
   * @apiErrorExample {json} List errors
   *    HTTP/1.1 403 Forbidden
   *    HTTP/1.1 400 Bad Request
   *    HTTP/1.1 404 Not Found
   */
  app.get(
    `${basePath}/:invitationId?`,
    authBearer,
    require(`${routePath}/get`)(app.locals.models),
  )
  /**
   * @api {delete} /api/collections/:collectionId/fragments/:fragmentId/invitations/:invitationId Delete invitation
   * @apiGroup FragmentsInvitations
   * @apiParam {collectionId} collectionId Collection id
   * @apiParam {fragmentId} fragmentId Fragment id
   * @apiParam {invitationId} invitationId Invitation id
   * @apiSuccessExample {json} Success
   *    HTTP/1.1 204 No Content
   * @apiErrorExample {json} Delete errors
   *    HTTP/1.1 403 Forbidden
   *    HTTP/1.1 404 Not Found
   *    HTTP/1.1 500 Internal Server Error
   */
  app.delete(
    `${basePath}/:invitationId`,
    authBearer,
    require(`${routePath}/delete`)(app.locals.models),
  )
  /**
   * @api {patch} /api/collections/:collectionId/fragments/:fragmentId/invitations/:invitationId Update an invitation
   * @apiGroup FragmentsInvitations
   * @apiParam {collectionId} collectionId Collection id
   * @apiParam {invitationId} invitationId Invitation id
   * @apiParam {fragmentId} fragmentId Fragment id
   * @apiParamExample {json} Body
   *    {
   *      "isAccepted": false,
   *      "reason": "I am not ready" [optional]
   *    }
   * @apiSuccessExample {json} Success
   *    HTTP/1.1 200 OK
   *   {
   *     "id": "7b2431af-210c-49f9-a69a-e19271066ebd",
   *     "role": "reviewer",
   *     "userId": "4c3f8ee1-785b-4adb-87b4-407a27f652c6",
   *     "hasAnswer": true,
   *     "invitedOn": 1525428890167,
   *     "isAccepted": false,
   *     "respondedOn": 1525428890299
   *    }
   * @apiErrorExample {json} Update invitations errors
   *    HTTP/1.1 403 Forbidden
   *    HTTP/1.1 400 Bad Request
   *    HTTP/1.1 404 Not Found
   *    HTTP/1.1 500 Internal Server Error
   */
  app.patch(
    `${basePath}/:invitationId`,
    authBearer,
    require(`${routePath}/patch`)(app.locals.models),
  )
  /**
   * @api {patch} /api/collections/:collectionId/fragments/:fragmentId/invitations/:invitationId/decline Decline an invitation as a reviewer
   * @apiGroup FragmentsInvitations
   * @apiParam {collectionId} collectionId Collection id
   * @apiParam {invitationId} invitationId Invitation id
   * @apiParamExample {json} Body
   *    {
   *      "invitationToken": "f2d814f0-67a5-4590-ba4f-6a83565feb4f",
   *    }
   * @apiSuccessExample {json} Success
   *    HTTP/1.1 200 OK
   *    {}
   * @apiErrorExample {json} Update invitations errors
   *    HTTP/1.1 403 Forbidden
   *    HTTP/1.1 400 Bad Request
   *    HTTP/1.1 404 Not Found
   *    HTTP/1.1 500 Internal Server Error
   */
  app.patch(
    `${basePath}/:invitationId/decline`,
    require(`${routePath}/decline`)(app.locals.models),
  )
}

module.exports = FragmentsInvitations