#!/usr/bin/env python3

import configparser
import json
from pprint import pprint
from zoomus import ZoomClient
import psycopg2
import psycopg2.extras
import time
import dateutil.parser
# import dateutil.tz

verbose = True
very_verbose = False

config = configparser.ConfigParser()
config.read('zoom.ini')

client = ZoomClient(config['api']['key'], config['api']['secret'])

db_conn = psycopg2.connect(dbname=config['db']['name'], user=config['db']['user'], password=config['db']['passwd'], host="127.0.0.1")
db = db_conn.cursor(cursor_factory=psycopg2.extras.NamedTupleCursor)


def parse_time(iso_time, tz_name):
    utc = dateutil.parser.isoparse(iso_time)
    # tz = dateutil.tz.gettz(tz_name)
    # return utc.astimezone(tz)
    return utc


def add_meeting(uid, meet):
    if 'start_time' not in meet:
        # Type 3 meetings (scheduled with no time) are ignored
        return

    db.execute("""
            INSERT INTO zoom_meetings
            (meeting_id, uuid, host_id, topic, type, start_time, duration)
            VALUES (%s, %s, %s, %s, %s, %s, %s)
        """, (
            meet['id'],
            meet['uuid'],
            uid,
            meet['topic'],
            meet['type'],
            parse_time(meet['start_time'], meet['timezone']),
            meet['duration'],
        ))


def get_meetings(uid, user_id):
    page_id = 1
    num_pages = 999
    expected_rec = 0
    total_rec = 0

    while page_id <= num_pages:
        if verbose:
            print(f"Fetching meetings for user {user_id}: page {page_id} of {num_pages}")

        resp = client.meeting.list(user_id = user_id, type = 'upcoming', page_number = page_id)
        resp.raise_for_status()

        meeting_list = json.loads(resp.content)
        if very_verbose:
            pprint(meeting_list)

        num_pages = meeting_list['page_count']
        expected_rec = meeting_list['total_records']

        for meet in meeting_list['meetings']:
            add_meeting(uid, meet)
            total_rec += 1

        page_id += 1
        time.sleep(0.2)

    assert total_rec == expected_rec, "Unexpected number of records, probably because of race condition"


db.execute('DELETE FROM zoom_meetings')

db.execute("SELECT * FROM zoom_users")
users = db.fetchall()
for u in users:
    get_meetings(u.id, u.user_id)

db_conn.commit()