#!/usr/bin/env python3

#  Copyright 2010-2017 Mads Michelsen (mail@brokkr.net)
# This file is part of Poca.
# Poca is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License,
# or (at your option) any later version.

"""A cron-friendly command line podcast aggregator"""


import sys
from queue import Queue
from time import sleep

import poca


def main():
    '''Main script'''
    try:

        # setup
        update_threads = []
        update_q = Queue()
        upgrade_threads = []
        skip_subs = []
        args = poca.args.get_poca_args()
        max_threads = args.threads if not args.verbose else 1
        stream_logger = poca.loggers.start_stream_logger(args)
        streamfail_logger = poca.loggers.start_after_stream_logger(args)
        conf = poca.config.Config(args, merge_default=True)
        valid_subs = poca.config.subs(conf)
        summary_logger = poca.loggers.start_summary_logger(args, conf.paths,
                                                           conf.xml.settings)

        # update loop
        for sub in valid_subs:
            update_thread = poca.subupdate.SubUpdateThread(
                update_q, poca.subupdate.SubUpdate, conf, sub)
            update_threads.append(update_thread)
            update_thread.start()

        # upgrade loop
        while len(upgrade_threads) + len(skip_subs) < len(valid_subs):
            while (len([t for t in upgrade_threads if t.is_alive()])
                   < max_threads and not update_q.empty()):
                subdata = update_q.get()
                if subdata.outcome.success is False:
                    poca.output.plans_error(subdata)
                    skip_subs.append(subdata)
                    update_q.task_done()
                    continue
                if subdata.status == 301:
                    _outcome = poca.subscribe.update_url(args, subdata)
                    poca.output.plans_moved(subdata, _outcome)
                if subdata.status == 304:
                    skip_subs.append(subdata)
                    update_q.task_done()
                    poca.output.plans_nochanges(subdata)
                    continue
                poca.output.plans_upgrade(subdata)
                upgrade_thread = poca.subupgrade.SubUpgradeThread(
                    subdata, update_q, poca.subupgrade.SubUpgrade)
                upgrade_threads.append(upgrade_thread)
                upgrade_thread.start()
            sleep(0.5)
        for upgrade_thread in upgrade_threads:
            upgrade_thread.join()

        # wrap up
        poca.output.after_stream_flush()
        poca.output.email_summary()

    except KeyboardInterrupt:
        for thread in upgrade_threads:
            setattr(thread, "kill", True)
        sys.exit()


if __name__ == '__main__':
    main()
