'use strict'
/** @typedef {import('@adonisjs/framework/src/Request')} Request */
/** @typedef {import('@adonisjs/framework/src/Response')} Response */
/** @typedef {import('@adonisjs/framework/src/View')} View */

const Call = use('App/Models/Call');

class WsCallAuth {
  /**
   * @param {object} ctx
   * @param {Request} ctx.request
   * @param {Function} next
   */
  async wsHandle(ctx, next) {
    const {request, auth, socket} = ctx;
    const callId = Number(socket.topic.split(':')[1]);
    const user = auth.user;
    const call = await Call.find(callId);
    if (!call) {
      throw new Error('Call not found');
    }
    if (call.state === 'ENDED') throw new Error('This call has ended');
    if (user.id === call.parent_id || user.id === call.guest_id) {
      ctx.call = call;
      await next()
    }
    // call next to advance the request
    else
      throw new Error('Not allowed');
  }
}

module.exports = WsCallAuth
