# -*- coding: utf-8 -*-
"""
-------------------------------------------------
   File Name：     UsefulProxyCheck
   Description :   check useful proxy
   Author :        JHao
   date：          2019/8/7
-------------------------------------------------
   Change Activity:
                   2019/8/7: check useful proxy
-------------------------------------------------
"""
__author__ = 'JHao'

from threading import Thread

try:
    from Queue import Queue, Empty  # py2
except:
    from queue import Queue, Empty  # py3

from Util import LogHandler
from Manager import ProxyManager
from ProxyHelper import checkProxyUseful, Proxy

FAIL_COUNT = 0


class UsefulProxyCheck(ProxyManager, Thread):
    def __init__(self, queue, thread_name):
        ProxyManager.__init__(self)
        Thread.__init__(self, name=thread_name)

        self.queue = queue
        self.log = LogHandler('useful_proxy_check')

    def run(self):
        self.log.info("UsefulProxyCheck - {}  : start".format(self.name))
        self.db.changeTable(self.useful_proxy_queue)
        while True:
            try:
                proxy_str = self.queue.get(block=False)
            except Empty:
                self.log.info("UsefulProxyCheck - {}  : exit".format(
                    self.name))
                break

            proxy_obj = Proxy.newProxyFromJson(proxy_str)
            proxy_obj, status = checkProxyUseful(proxy_obj)
            if (status or proxy_obj.fail_count < FAIL_COUNT):
                self.db.put(proxy_obj)
                self.log.info(
                    'UsefulProxyCheck - {}  : {} validation pass'.format(
                        self.name, proxy_obj.proxy.ljust(20)))
            else:
                self.log.info(
                    'UsefulProxyCheck - {}  : {} validation fail'.format(
                        self.name, proxy_obj.proxy.ljust(20)))
                self.db.delete(proxy_obj.proxy)
            self.queue.task_done()


def doUsefulProxyCheck():
    proxy_queue = Queue()

    pm = ProxyManager()
    pm.db.changeTable(pm.useful_proxy_queue)
    for _proxy in pm.db.getAll():
        proxy_queue.put(_proxy)

    thread_list = list()
    for index in range(10):
        thread_list.append(UsefulProxyCheck(proxy_queue, "thread_%s" % index))

    for thread in thread_list:
        thread.start()

    for thread in thread_list:
        thread.join()


if __name__ == '__main__':
    doUsefulProxyCheck()
