import time
import asyncio

from python3_anticaptcha import get_sync_result, get_async_result


class CustomResultHandler:
    def __init__(self, anticaptcha_key: str, sleep_time: int = 5, **kwargs):
        """
        The module is responsible for obtaining a captcha solution by task ID
        :param anticaptcha_key: Key to AntiCaptcha
        :param sleep_time: Solution timeout
        """
        if sleep_time < 5:
            raise ValueError(f"Param `sleep_time` must be greater than 5. U set - {sleep_time}")
        self.sleep_time = sleep_time
        # payload for receiving service response
        self.result_payload = {"clientKey": anticaptcha_key}

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        if exc_type:
            return False
        return True

    def task_handler(self, task_id: int) -> dict:
        """
        Method get task ID and try get captcha solution from server
        :param task_id: Captcha task ID
        """
        # update payload to get a captcha solution
        self.result_payload.update({"taskId": task_id})

        # wait captcha solution result
        time.sleep(self.sleep_time)
        return get_sync_result(result_payload=self.result_payload, sleep_time=self.sleep_time)


class aioCustomResultHandler:
    def __init__(self, anticaptcha_key: str, sleep_time: int = 5, **kwargs):
        """
        The async module is responsible for obtaining a captcha solution by task ID
        :param anticaptcha_key: Key to AntiCaptcha
        :param sleep_time: Solution timeout
        """
        if sleep_time < 5:
            raise ValueError(f"Param `sleep_time` must be greater than 5. U set - {sleep_time}")
        self.sleep_time = sleep_time
        # payload for receiving service response
        self.result_payload = {"clientKey": anticaptcha_key}

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        if exc_type:
            return False
        return True

    async def task_handler(self, task_id: int) -> dict:
        """
        Method get task ID and try get captcha solution from server
        :param task_id: Captcha task ID
        """
        # update payload to get a captcha solution
        self.result_payload.update({"taskId": task_id})

        # wait captcha solution result
        await asyncio.sleep(self.sleep_time)
        return await get_async_result(
            result_payload=self.result_payload, sleep_time=self.sleep_time
        )
