from flask import jsonify, make_response
from flask_restful import Resource, reqparse
import requests
import config as conf


class CreateVideoRoom(Resource):
    def post(self):
        parser = reqparse.RequestParser()
        parser.add_argument('session_id', required=False)
        parser.add_argument('handle_id')
        parser.add_argument('room_number')
        parser.add_argument('transaction_id')
        args = parser.parse_args()
        session_id = args['session_id']
        handle_id = args['handle_id']
        room_number = args['room_number']
        transaction_id = args['transaction_id']

        # Create Video Room
        body = {
            'request': 'create',
            'room': room_number,
            'permanent': False,
            'notify_joining': True
        }
        params = {'janus': 'message', 'transaction': transaction_id, 'body': body}
        create_video_room = requests.post(
            conf.Config.API_BASE_URL + 'janus/' + str(session_id) + str(handle_id),
            json=params,
            headers={
                'Content-Type': 'application/json'
            },
            verify=False
        )

        if create_video_room.status_code == 200:
            return jsonify(status=1, message='Success', result=create_video_room.json())
        else:
            return jsonify(status=0, message='Fail', result='Something went wrong on creating Video Room')


class DestroyVideoRoom(Resource):
    def post(self):
        parser = reqparse.RequestParser()
        parser.add_argument('session_id')
        parser.add_argument('handle_id')
        parser.add_argument('room_number')
        parser.add_argument('transaction_id')
        args = parser.parse_args()
        session_id = args['session_id']
        handle_id = args['handle_id']
        room_number = args['room_number']
        transaction_id = args['transaction_id']

        # Destroy Video room
        body = {
            'request': 'destroy',
            'room': room_number,
            'permanent': False
        }
        params = {'janus': 'message', 'transaction': transaction_id, 'body': body}
        destroy_video_room = requests.post(
            conf.Config.API_BASE_URL + 'janus/' + str(session_id) + str(handle_id),
            json=params,
            headers={
                'Content-Type': 'application/json'
            },
            verify=False
        )

        if destroy_video_room.status_code == 200:
            return jsonify(status=1, message='Success', result={destroy_video_room.json()})
        else:
            return jsonify(status=0, message='Fail', result='Something went wrong on destroying Video Room')


class EditVideoRoom(Resource):
    def post(self):
        parser = reqparse.RequestParser()
        parser.add_argument('session_id')
        parser.add_argument('handle_id')
        parser.add_argument('room_number')
        parser.add_argument('transaction_id')
        args = parser.parse_args()
        session_id = args['session_id']
        handle_id = args['handle_id']
        room_number = args['room_number']
        transaction_id = args['transaction_id']

        # Edit Video room
        body = {
            'request': 'edit',
            'room': room_number,
            'secret': "",
            'new_description': "",
            'new_secret': "",
            'new_pin': "",
            'new_is_private': "",
            'new_require_pvtid': "",
            'new_bitrate': "",
            'new_fir_freq': "",
            'new_publishers': "",
            'new_lock_record': "",
            'permanent': False
        }
        params = {'janus': 'message', 'transaction': transaction_id, 'body': body}
        edit_video_room = requests.post(
            conf.Config.API_BASE_URL + 'janus/' + str(session_id) + str(handle_id),
            json=params,
            headers={
                'Content-Type': 'application/json'
            },
            verify=False
        )

        if edit_video_room.status_code == 200:
            return jsonify(status=1, message='Success', result={edit_video_room.json()})
        else:
            return jsonify(status=0, message='Fail', result='Something went wrong on editing Video Room')


class RoomExists(Resource):
    def post(self):
        parser = reqparse.RequestParser()
        parser.add_argument('session_id')
        parser.add_argument('handle_id')
        parser.add_argument('room_number')
        parser.add_argument('transaction_id')
        args = parser.parse_args()
        session_id = args['session_id']
        handle_id = args['handle_id']
        room_number = args['room_number']
        transaction_id = args['transaction_id']

        body = {
            'request': 'exists',
            'room': room_number
        }

        params = {'janus': 'message', 'transaction': transaction_id, 'body': body}
        video_room_exists = requests.post(
            conf.Config.API_BASE_URL + 'janus/' + str(session_id) + str(handle_id),
            json=params,
            headers={
                'Content-Type': 'application/json'
            },
            verify=False
        )

        if video_room_exists.status_code == 200:
            return jsonify(status=1, message='Success', result={video_room_exists.json()})
        else:
            return jsonify(status=0, message='Fail', result='Something went wrong on checking if Video Room Exists')


class KickUser(Resource):
    def post(self):
        parser = reqparse.RequestParser()
        parser.add_argument('session_id')
        parser.add_argument('handle_id')
        parser.add_argument('room_number')
        parser.add_argument('transaction_id')
        args = parser.parse_args()
        session_id = args['session_id']
        handle_id = args['handle_id']
        room_number = args['room_number']
        transaction_id = args['transaction_id']

        body = {
            'request': 'kick',
            'secret': "",
            'room': room_number,
            'id': ""
        }

        params = {'janus': 'message', 'transaction': transaction_id, 'body': body}
        video_room_kick_user = requests.post(
            conf.Config.API_BASE_URL + 'janus/' + str(session_id) + str(handle_id),
            json=params,
            headers={
                'Content-Type': 'application/json'
            },
            verify=False
        )

        if video_room_kick_user.status_code == 200:
            return jsonify(status=1, message='Success', result={video_room_kick_user.json()})
        else:
            return jsonify(status=0, message='Fail', result='Something went wrong in kicking a user')


class ListRooms(Resource):
    def post(self):
        parser = reqparse.RequestParser()
        parser.add_argument('session_id')
        parser.add_argument('handle_id')
        parser.add_argument('transaction_id')
        args = parser.parse_args()
        session_id = args['session_id']
        handle_id = args['handle_id']
        transaction_id = args['transaction_id']

        body = {
            'request': 'list'
        }

        params = {'janus': 'message', 'transaction': transaction_id, 'body': body}
        list_video_room = requests.post(
            conf.Config.API_BASE_URL + 'janus/' + str(session_id) + str(handle_id),
            json=params,
            headers={
                'Content-Type': 'application/json'
            },
            verify=False
        )

        if list_video_room.status_code == 200:
            return jsonify(status=1, message='Success', result={list_video_room.json()})
        else:
            return jsonify(status=0, message='Fail', result='Something went wrong in listing rooms')


class ListParticipants(Resource):
    def post(self):
        parser = reqparse.RequestParser()
        parser.add_argument('session_id')
        parser.add_argument('handle_id')
        parser.add_argument('room_number')
        parser.add_argument('transaction_id')
        args = parser.parse_args()
        session_id = args['session_id']
        handle_id = args['handle_id']
        room_number = args['room_number']
        transaction_id = args['transaction_id']

        body = {
            'request': 'listparticipants',
            'room': room_number
        }

        params = {'janus': 'message', 'transaction': transaction_id, 'body': body}
        list_participants_video_room = requests.post(
            conf.Config.API_BASE_URL + 'janus/' + str(session_id) + str(handle_id),
            json=params,
            headers={
                'Content-Type': 'application/json'
            },
            verify=False
        )

        if list_participants_video_room.status_code == 200:
            return jsonify(status=1, message='Success', result={list_participants_video_room.json()})
        else:
            return jsonify(status=0, message='Fail', result='Something went wrong in listing rooms')


class PublisherJoinRoom(Resource):
    def post(self):
        parser = reqparse.RequestParser()
        parser.add_argument('session_id')
        parser.add_argument('handle_id')
        parser.add_argument('room_number')
        parser.add_argument('transaction_id')
        parser.add_argument('display_name')
        args = parser.parse_args()
        session_id = args['session_id']
        handle_id = args['handle_id']
        room_number = args['room_number']
        transaction_id = args['transaction_id']
        display_name = args['display_name']

        body = {
            'request': 'join',
            'ptype': 'publisher',
            'room': room_number,
            'id': '',
            'display': display_name,
            'token': ''
        }

        params = {'janus': 'message', 'transaction': transaction_id, 'body': body}
        publisher_join_video_room = requests.post(
            conf.Config.API_BASE_URL + 'janus/' + str(session_id) + str(handle_id),
            json=params,
            headers={
                'Content-Type': 'application/json'
            },
            verify=False
        )

        if publisher_join_video_room.status_code == 200:
            return jsonify(status=1, message='Success', result={publisher_join_video_room.json()})
        else:
            return jsonify(status=0, message='Fail', result='Something went wrong in listing rooms')

