from json import load
from time import sleep
from requests import get, post
from os.path import abspath

# класс парсера(делает запрос по урл, передаёт полученные данные в экстрактор, а также делает повторные запросы в случае отрицательного ответа со стороны сервера)
class Parser:
    def __init__(self, json_data):
        self.proxies = {
            "http": f'{json_data["proxy"]}',
            "https": f'{json_data["proxy"]}'
        } if json_data["proxy"] != "" else ""
        self.request_delay = json_data["request_delay"]
        self.request_repeats = json_data["request_repeats"]
        self.request_repeat_delay = json_data["request_repeat_delay"]
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Linux; Android 8.1.0; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Mobile Safari/537.36 PTST/240201.144844'
        }

    def parse(self, url, method="GET", return_type="text"):
        sleep(self.request_delay)
        for i in range(self.request_repeats):

            try:
                if method == "GET":
                    response = get(url, headers=self.headers, proxies=self.proxies)
                else:
                    response = post(url, headers=self.headers, proxies=self.proxies)
            except Exception as error:
                print(f"Request Error: {error} - {url}")
                continue

            if response.status_code == 200:
                if return_type == "text":
                    return response.text
                else:
                    return response.json()
            else:
                print(f"bad response, status code -> {response.status_code} - {url}")
                if response.status_code == 404:
                    break

            sleep(self.request_repeat_delay)
        return None

# получение объекта Парсера с настройками из request_settings.json
def get_parser():
    with open(abspath("request_settings.json"), "r", encoding="utf-8") as file:
        return Parser(load(file))