#!/usr/bin/env python3
# -*- coding: utf-8 -*-

### to use this script you will need to ###
# apt install pip3
# pip3 install bigbluebutton_api_python
# pip3 install pyyaml

import argparse, sys, os, logging, yaml, urllib, json
from bigbluebutton_api_python import BigBlueButton

logging.basicConfig(level=os.environ.get("LOGLEVEL", "INFO"))

parser = argparse.ArgumentParser()
parser.add_argument("-s","--server", help="Big Blue Button Server URL")
parser.add_argument("-c","--config", help="path to config file in yaml format e.g. your docker-compose.yml", default="./docker-compose.yml")
parser.add_argument("-u","--user", help="fullName to use for joinUrls of showMeetings command", default="system administrator")
parser.add_argument("-p","--secret", help="Big Blue Button Secret")
args = parser.parse_args()

def get_config_item(list_item):
    try:
        with open(args.config) as file:
            config = yaml.load(file)
    except FileNotFoundError as ERR:
        logging.error(ERR)
        sys.exit()

    docker_environment = config['services']['bbb-streamer']['environment']
    for line in docker_environment:
        if line.strip().startswith(list_item):
            return line.partition('=')[2]

def get_join_url(id, name, role='attendee', pw=None):
    pwd = None
    if pw:
        pwd = pw
    elif bbb.get_meeting_info(id):
        minfo = bbb.get_meeting_info(id)
        if role == 'moderator':
            pwd = minfo.get_meetinginfo().get_moderatorpw()
        elif role == 'attendee':
            pwd = minfo.get_meetinginfo().get_attendeepw()
    if pwd:
        return bbb.get_join_meeting_url(name, id, pwd)

def get_meetings():
    logging.info("fetching meetings from {}".format(args.server))
    try:
        return bbb.get_meetings()
    except urllib.error.URLError as ERR:
        logging.error(ERR)
        sys.exit()

if args.server != None and args.secret != None:
    logging.info("using server and password provided")
elif args.config:
    logging.info("using server and password from config file")
    args.server = get_config_item('BBB_URL')
    args.secret = get_config_item('BBB_SECRET')
else:
    logging.error("Error: Please specify server and password or the path to the config file")
    sys.exit()

def get_meetings(server):
    logging.info("fetching meetings from {}".format(server))
    try:
        meetingsXML = bbb.get_meetings()
        if meetingsXML.get_field('returncode') == 'SUCCESS':
            if  meetingsXML.get_field('meetings') == '':
                logging.info("no meetings running on {}".format(server))
                return []
            else:
                rawMeetings = meetingsXML.get_field('meetings')['meeting']
                if isinstance(rawMeetings, list):
                    logging.info("meetings found on {}".format(server))
                    return json.loads(json.dumps(rawMeetings))
                else:
                    logging.info("meeting found on {}".format(server))
                    return [json.loads(json.dumps(rawMeetings))]
        else:
            logging.error("api request failed")
            return []
    except urllib.error.URLError as ERR:
        logging.error(ERR)
        return []

def find_meeting(server, title):
    meetings = get_meetings(server)
    for meeting in meetings:
        if title in meeting['meetingName']:
            meeting['joinAttendeeUrl'] = get_join_url(meeting['meetingID'], args.user, 'attendee')
            meeting['joinModeratorUrl'] = get_join_url(meeting['meetingID'], args.user, 'moderator')
            return meeting

def show_meetings(server):
    meetings = get_meetings(server)
    for meeting in meetings:
        print(meeting['meetingName'])
        print("ID: {}".format(meeting['meetingID']))
        print("ATTENDEE_PASSWORD: {}".format(meeting['attendeePW']))
        joinAttendeeUrl = get_join_url(meeting['meetingID'], args.user, 'attendee')
        print("JOIN_ATTENDEE_URL: {}".format(joinAttendeeUrl))
        print("MODERATOR_PASSWORD: {}".format(meeting['moderatorPW']))
        joinModeratorUrl = get_join_url(meeting['meetingID'], args.user, 'moderator')
        print("JOIN_MODERATOR_URL: {}".format(joinModeratorUrl))
        print("")


bbb = BigBlueButton(args.server,args.secret)
show_meetings(args.server)