# _*_ coding: utf-8 _*_
import logging
import multiprocessing
# 导入子线程
from .threads import DistributeThread
from .threads import CatalogParseThread
from .threads import DetailedParseThread


class ParseProcess(multiprocessing.Process):
    '''解析进程，子进程'''
    _api = "https://spa5.scrape.center/api/book?"
    def __init__(self, link_queue: 'multiprocessing.Queue',
                data_queue: 'multiprocessing.Queue',
                parse_pipe: 'multiprocessing.connection.Connection'):
        super(ParseProcess, self).__init__()
        # 进程队列 - 请求链接
        self._link_queue = link_queue
        # 进程队列 - 响应数据
        self._data_queue = data_queue
        # 进程管道对象
        self._parse_pipe = parse_pipe    


    def push_catalog_urls(self, nums: int=10) -> None:
        '''推送到爬虫进程中，目录链接'''
        # 临时目录链接参数字典对象
        temp_params = {"limit": 18}
        for page in range(nums):
            offset = page * 18
            # 新参数字典对象
            params = temp_params.copy()
            params["offset"] = offset
            # 放入链接队列
            self._link_queue.put(params)

        
    def run(self) -> None:  
        # 分配线程
        DistributeThread(self._data_queue).start()
        # 目录页解析线程
        CatalogParseThread(self._link_queue).start()
        # 详细页解析线程
        DetailedParseThread().start()
        # 解析子进程 - 主线程
        while True:
            # 获得目录爬取页数，此参数是整数必大于0
            datas = self._parse_pipe.recv()
            if isinstance(datas, SystemExit):
                break

            # 生成目录页链接参数放入队列
            self.push_catalog_urls(datas)

        logging.info("Parse Exit")
    

