#!/usr/bin/env python3

import prepare
import time

import sendmail
from db import DB

from mastodonbot import MastodonBot
from twitterbot import TwitterBot
from mailbot import Mailbot
from trigger import Trigger


def get_users(db):
    user_rows = db.get_users()
    users = {}
    for row in user_rows:
        users[row[0]] = []
    return users


def init_bots(config, logger, db, users):
    for uid in users:
        users[uid].append(Trigger(config, uid, db))
        users[uid].append(MastodonBot(config, logger, uid, db))
        users[uid].append(TwitterBot(config, logger, uid, db))
        users[uid].append(Mailbot(config, logger, uid, db))
    return users


def run():
    config = prepare.get_config()
    logger = prepare.get_logger(config)
    db = DB()

    while True:
        # get a dictionary { uid : [ Bot objects ] }
        users = get_users(db)

        # initialize bots
        users = init_bots(config, logger, db, users)

        try:
            for uid in users:
                for bot in users[uid]:
                    reports = bot.crawl()
                    for status in reports:
                        if not users[uid][0].is_ok(status.text):
                            continue
                        for bot2 in users[uid]:
                            if bot == bot2:
                                bot2.repost(status)
                            else:
                                bot2.post(status)
                time.sleep(60)  # twitter rate limit >.<
        except KeyboardInterrupt:
            print("Good bye. Remember to restart the bot!")
        except:
            logger.error('Shutdown', exc_info=True)
            for uid in users:
                for bot in users[uid]:
                    bot.save_last()
            mailer = sendmail.Mailer(config)
            try:
                mailer.send('', config['web']['contact'],
                            'Ticketfrei Crash Report',
                            attachment=config['logging']['logpath'])
            except:
                logger.error('Mail sending failed', exc_info=True)


if __name__ == '__main__':
    run()