import requests
import aiohttp

from python3_anticaptcha import get_balance_url, incorrect_captcha_url, get_queue_status_url


class AntiCaptchaControl:
    def __init__(self, anticaptcha_key: str):
        """
        Синхронный метод работы с балансом и жалобами
        :param anticaptcha_key: Ключ антикапчи
        """
        self.ANTICAPTCHA_KEY = anticaptcha_key
    
    def __enter__(self):
        return self

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

    def get_balance(self):
        """
        Получение баланса аккаунта
        :return: Возвращает актуальный баланс
        """
        answer = requests.post(get_balance_url, json={'clientKey': self.ANTICAPTCHA_KEY})

        return answer.json()

    def complaint_on_result(self, reported_id: int):
        """
        Позволяет отправить жалобу на неправильно решённую капчу.
        :param reported_id: Отправляете ID капчи на которую нужно пожаловаться
        :return: Возвращает True/False, в зависимости от результата
        """
        payload = {'clientKey': self.ANTICAPTCHA_KEY,
                   'taskId': reported_id,
                   }

        answer = requests.post(incorrect_captcha_url, json=payload)

        return answer.json()

    def get_queue_status(self, queue_id: int):
        """
        Получение информации о загрузке очереди, в зависимости от ID очереди

        Метод позволяет определить, нсколько в данный момент целесообразно загружать новое задание в очередь
        Данные в выдаче кешируются на 10 секунд

        Список ID очередей:
            1   - стандартная ImageToText, язык английский
            2   - стандартная ImageToText, язык русский
            5   - Recaptcha NoCaptcha
            6   - Recaptcha Proxyless
            7   - Funcaptcha
            10  - Funcaptcha Proxyless

        Пример выдачи ответа:
            {
                "waiting":242,
                "load":60.33,
                "bid":"0.0008600982",
                "speed":10.77,
                "total": 610
            }
        :param queue_id: Номер очереди
        :return: JSON-объект
        """
        payload = {
            "queueId": queue_id
        }

        answer = requests.post(get_queue_status_url, json=payload)

        return answer.json()


class aioAntiCaptchaControl:
    def __init__(self, anticaptcha_key: str):
        """
        Асинхронный метод работы с балансом и жалобами
        :param anticaptcha_key: Ключ антикапчи
        """
        self.ANTICAPTCHA_KEY = anticaptcha_key
    
    def __enter__(self):
        return self

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

    async def get_balance(self):
        """
        Получение баланса аккаунта
        :return: Возвращает актуальный баланс
        """
        async with aiohttp.ClientSession() as session:
            async with session.post(get_balance_url, json={'clientKey': self.ANTICAPTCHA_KEY}) as resp:
                return await resp.json()

    async def complaint_on_result(self, reported_id: int):
        """
        Позволяет отправить жалобу на неправильно решённую капчу.
        :param reported_id: Отправляете ID капчи на которую нужно пожаловаться
        :return: Возвращает True/False, в зависимости от результата
        """
        payload = {'clientKey': self.ANTICAPTCHA_KEY,
                   'taskId': reported_id,
                   }
        async with aiohttp.ClientSession() as session:
            async with session.post(incorrect_captcha_url, json=payload) as resp:
                return await resp.json()

    async def get_queue_status(self, queue_id: int):
        """
        Получение информации о загрузке очереди, в зависимости от ID очереди

        Метод позволяет определить, нсколько в данный момент целесообразно загружать новое задание в очередь
        Данные в выдаче кешируются на 10 секунд

        Список ID очередей:
            1   - стандартная ImageToText, язык английский
            2   - стандартная ImageToText, язык русский
            5   - Recaptcha NoCaptcha
            6   - Recaptcha Proxyless
            7   - Funcaptcha
            10  - Funcaptcha Proxyless

        Пример выдачи ответа:
            {
                "waiting":242,
                "load":60.33,
                "bid":"0.0008600982",
                "speed":10.77,
                "total": 610
            }
        :param queue_id: Номер очереди
        :return: JSON-объект
        """
        payload = {
            "queueId": queue_id
        }

        async with aiohttp.ClientSession() as session:
            async with session.post(get_queue_status_url, json=payload) as resp:
                return await resp.json()