from PyQt5.QtCore import QThread, pyqtSignal, QObject
import time
from src.web_scraper_async import *

class APISearchWorker(QObject):
    finished = pyqtSignal(list, float)

    def __init__(self, kiprisObject, keyword, set_status):
        super().__init__()
        self.kiprisObject = kiprisObject
        self.keyword = keyword
        self.set_status = set_status

    def run(self):
        start_time = time.time()  # 검색 시작 시간
        print(f"Search keyword : [{self.keyword}], self.set_status : [{self.set_status}]")
        result = self.kiprisObject.run(self.keyword, self.set_status)
        print(f"Search finished | result \n [{result}]")
        elapsed_time = time.time() - start_time  # 경과 시간 계산
        self.finished.emit(result, elapsed_time)

class SearchThread(QThread):
    def __init__(self, worker):
        super().__init__()
        self.worker = worker
        self.worker.moveToThread(self)
        self.worker.finished.connect(self.handle_finished)

    def run(self):
        self.worker.run()
        # self.quit()
        self.exec_()

    def start_search(self):
        self.start()

    def handle_finished(self, result, elapsed_time):
        # 검색 작업이 완료되면 이 시그널이 발생합니다.
        print(f"Search finished : [{elapsed_time}]초 경과")


class AsyncWebSearchWorker(QObject):
    finished = pyqtSignal(object, float)  # 결과와 소요 시간을 전달할 신호 정의

    def __init__(self, term, set_status):
        super().__init__()
        self.term = term
        self.set_status = set_status
        self.scraper = WebScraper()  # WebScraper 인스턴스 생성
        self.thread = QThread()  # 별도의 스레드 생성
        self.moveToThread(self.thread)  # 이 객체를 새 스레드로 이동
        self.thread.started.connect(self.run)  # 스레드가 시작되면 run 메서드 실행
        self.start_time = None

    def start(self):
        self.thread.start()  # 스레드 시작

    def run(self):
        self.start_time = time.time()  # 검색 시작 시간 기록
        asyncio.set_event_loop(asyncio.new_event_loop())
        loop = asyncio.get_event_loop()
        loop.run_until_complete(self.async_run())

    async def async_run(self):
        try:
            await self.scraper.setup_browser()  # 브라우저 설정
            result = await self.scraper.run(self.term, self.set_status)  # 검색어를 사용하여 검색 실행
            elapsed_time = time.time() - self.start_time  # 소요 시간 계산
            self.finished.emit(result, elapsed_time)  # 작업 완료 신호 전송
        except Exception as e:
            print(f"Error in AsyncWebSearchWorker: {e}")
            self.finished.emit(None, 0)  # 에러 발생 시 None 전송
        finally:
            await self.scraper.close_Kipris()  # 리소스 정리
            self.thread.quit()  # 스레드 종료
