import requests
import ssl
from requests.packages.urllib3.poolmanager import PoolManager
from requests.packages.urllib3.util import ssl_
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
import time
import json
import random

CIPHERS = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384: ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:AES256-SHA"


class TlsAdapter(HTTPAdapter):
    def __init__(self, ssl_options=0, **kwargs):
        self.ssl_options = ssl_options
        super(TlsAdapter, self).__init__(
            **kwargs, pool_maxsize=5, max_retries=3, pool_block=False
        )

    def init_poolmanager(self, *pool_args, **pool_kwargs):
        ctx = ssl_.create_urllib3_context(
            ciphers=CIPHERS, cert_reqs=ssl.CERT_REQUIRED, options=self.ssl_options
        )
        self.poolmanager = PoolManager(*pool_args, ssl_context=ctx, **pool_kwargs)


class RequestManager(object):
    def __init__(self, get_alternator):
        self.adapter = TlsAdapter(ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1)
        self.get_alternator = get_alternator

    def getNewSession(self):
        s = requests.Session()
        s.mount("https://", self.adapter)
        return s

    def getRequest(self, url, get_alternator=0) -> requests.Response:
        if get_alternator == 3:
            return self.getRequestProxyCheap(url)
        if get_alternator == 2:
            return self.getRequestProxyScrape(url)
        if get_alternator == 1:
            return self.getRequestIPRoyal(url)
        if get_alternator == 0:
            return self.getRequestProxyScrape(url)

    def getRequestWithoutAWS(self, url):
        webshare_response = self.getRequestWebshare(url)
        if webshare_response is not None:
            return webshare_response
        return None

    def getRequestIPRoyal(self, url):
        print("Trying to get: " + str(url) + " with IPRoyal")
        s = self.getNewSession()
        iproyal_proxy = "http://alex133769:mArgare1he_region-europe_streaming-1@geo.iproyal.com:12321"
        s.proxies.update({"https": iproyal_proxy, "http": iproyal_proxy})
        try:
            response = s.get(url, timeout=10)
            if response.status_code != 200:
                return None
            return response
        except Exception as e:
            print("Exception in getRequestIPRoyal: " + str(e))
        return None

    def getRequestProxyCheap(self, url):
        print("Trying to get: " + str(url) + " with ProxyCheap")
        s = self.getNewSession()
        proxycheap_proxy = "http://bkxwrzbp:25vLo8CZESG3alvb@209.38.175.10:31112"
        s.proxies.update({"https": proxycheap_proxy, "http": proxycheap_proxy})
        try:
            response = s.get(url, timeout=10)
            if response.status_code != 200:
                return None
            return response
        except Exception as e:
            print("Exception in getRequestProxyCheap: " + str(e))
        return None

    def getRequestProxyScrape(self, url):
        print("Trying to get: " + str(url) + " with Proxyscrape")
        s = self.getNewSession()
        proxyscrape_proxy = "http://che4pvco7u1h1db:bvt6yy7wrahb637@rp.proxyscrape.com:6060"
        
        s.proxies.update({"https": proxyscrape_proxy, "http": proxyscrape_proxy})
        try:
            response = s.get(url, timeout=10)
            if response.status_code != 200:
                return None
            return response
        except Exception as e:
            print("Exception in getRequestProxyScrape: " + str(e))
        return None

    def getRequestNaked(self, url) -> requests.Response:
        s = self.getNewSession()
        r = s.get(url)
        return r

    def postRequestNaked(self, url, _json) -> requests.Response:
        s = self.getNewSession()
        r = s.post(url, json=_json)
        return r