from selenium import webdriver
import time
from fake_useragent import UserAgent
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import re
import threading
import random
from RequestManager import RequestManager
import os
import urllib
import urllib.parse
from urllib.parse import urlparse
import sys


lock = threading.Lock()
get_alternator = 1
ReqMan = RequestManager(get_alternator=get_alternator)

def generateHTML(urli, pages, steamid, queryid):
    start = 0
    for page in range(pages):
        url = "https://steamcommunity.com/market/listings/730/" + urli + "/render/?query=&start=" + str(start) + "&count=100&currency=3"
        pre = str(
            '<html><script type="text/javascript">g_steamID = "76561198062672769"; VALVE_PUBLIC_PATH = "https:\\/\\/community.akamai.steamstatic.com\\/public\\/";</script><script type="text/javascript" src="https://community.akamai.steamstatic.com/public/javascript/scriptaculous/_combined.js?v=OeNIgrpEF8tL&amp;l=english&amp;load=effects,controls,slider,dragdrop" ></script><script type="text/javascript" src="https://community.akamai.steamstatic.com/public/javascript/global.js?v=mqQ0OvgabXsr&amp;l=english" ></script><script type="text/javascript" src="https://community.akamai.steamstatic.com/public/javascript/jquery-1.11.1.min.js?v=.isFTSRckeNhC" ></script><script type="text/javascript" src="https://community.akamai.steamstatic.com/public/shared/javascript/tooltip.js?v=.zYHOpI1L3Rt0" ></script><script type="text/javascript" src="https://community.akamai.steamstatic.com/public/shared/javascript/shared_global.js?v=y7rozL7uuNwI&amp;l=english" ></script><script type="text/javascript">$J = jQuery.noConflict(); if ( typeof JSON != "object" || !JSON.stringify || !JSON.parse ) { document.write( "<scr" + "ipt type="text\\/javascript" src="https:\\/\\/community.akamai.steamstatic.com\\/public\\/javascript\\/json2.js?v=pmScf4470EZP&amp;l=english" ><\\/script>\n" ); };<\\/script></script><div id="searchResultsRows"><script type="text/javascript">$J = jQuery.noConflict();</script>'
        )

        end = False
        counter = 0
        while not end:
            counter += 1
            if counter > 10:
                return None
            global get_alternator
            get_alternator = (get_alternator + 1) % 4
            r = ReqMan.getRequest(url=url, get_alternator=get_alternator)
            if r is None:
                continue
            try:
                r = r.json()
            except Exception as e:
                print(str(e))
                continue
            if r["success"] is False:
                continue
            time.sleep(1)
            end = True

        results_html = r["results_html"]

        listinginfo = "var g_rgListingInfo = " + str(r["listinginfo"]) + ";"
        assets = "var g_rgAssets = " + str(r["assets"]) + ";"
        walletinfo = 'var g_rgWalletInfo = {"wallet_currency":3,"wallet_country":"AT","wallet_state":"","wallet_fee":"1","wallet_fee_minimum":"1","wallet_fee_percent":"0.05","wallet_publisher_fee_percent_default":"0.10","wallet_fee_base":"0","wallet_balance":"472","wallet_delayed_balance":"0","wallet_max_balance":"200000","wallet_trade_max_balance":"180000","success":1,"rwgrsn":-2};'
        g_oSearchResults = "null;"
        marketcheckhash = "MarketCheckHash();"

        full_html = (
            pre
            + "\n"
            + results_html
            + '<script type="text/javascript">'
            + listinginfo
            + "\n"
            + assets
            + "\n"
            + walletinfo
            + "\n"
            + g_oSearchResults
            + "\n"
            + marketcheckhash
            + "</script>"
        )

        with lock:
            randint = random.randint(0, 133769420)
            f = open("market/listings/730/index" + str(randint) + ".html", "w")
            f.write(str(full_html))
            f.close()
        skins_with_ranks = getRanks(randint)

        with lock:
        #steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20M4395007889466203604A16510272647D4667080302435763129.txt
            parsed_url = urlparse(url)
            final_filename = parsed_url.path.split("/")[4]
            f = open("rank_txts/" + str(queryid) + "_" + str(steamid) + "_" + urllib.parse.quote((final_filename)) + "_" + str(page) + ".txt", "w")
            f.write(str(skins_with_ranks))
            f.close()
        start += 100

def getRanks(index_int):
    skins_with_ranks = []

    proxy = "127.0.0.1:9981"
    # C:\Users\akroi\AppData\Local\Google\Chrome\User Data\Default\Extensions\jjicbefpemnphinccgikpdaagjebbnhg\3.2.4_0
    csfloat_ext = "3.2.4_0.crx"
    options = webdriver.ChromeOptions()
    options.add_extension(csfloat_ext)
    options.add_argument(f"--proxy-server={proxy}")
    options.add_argument("--headless=new")
    options.add_argument("--ignore-ssl-errors=yes")
    options.add_argument("--ignore-certificate-errors")
    options.add_argument("--blink-settings=imagesEnabled=false")
    options.add_argument("--no-sandbox")
    options.add_argument("--disable-dev-shm-usage")

    driver = webdriver.Chrome(options=options)

    driver.get(
        "http://steamcommunity.com/market/listings/730/index" + str(index_int) + ".html"
    )
    time.sleep(5)

    try:
        csfloat_item_row_wrappers = driver.find_elements(
            By.XPATH, "//*[starts-with(@id, 'listing_')]"
        )
    except Exception as e:
        print(str(e))
        driver.quit()
        return None

    if len(csfloat_item_row_wrappers) == 0:
        print("nix")
        driver.quit()
        return None

    try:
        for wrapper in csfloat_item_row_wrappers:
            rank = re.findall("Rank #([0-9]*)", str(wrapper.text))
            html = wrapper.get_attribute("outerHTML")
            soup = BeautifulSoup(html, "html.parser")
            try:
                inspect_link = soup.find("a", {"class": "csfloat-easy-inspect"}).get(
                    "href"
                )
            except Exception as e:
                inspect_link = ""
            if len(rank) > 0:
                rank = str(list(rank)[0])
                skins_with_ranks.append([inspect_link, rank])
    except Exception as e:
        print(str(e))
        driver.quit()
        return None

    # print(skins_with_ranks)
    driver.quit()
    os.remove("/var/www/premiumrankchecker/market/listings/730/index" + str(index_int) + ".html")
    return skins_with_ranks


if __name__ == "__main__":

    generateHTML(str(sys.argv[1]), int(sys.argv[2]), str(sys.argv[3]), int(sys.argv[4]))
    # url_list = [
    #     "https://steamcommunity.com/market/listings/730/StatTrak™%20MP9%20%7C%20Starlight%20Protector%20(Battle-Scarred)/render/?query=&start=0&count=100&currency=3",
    #     "https://steamcommunity.com/market/listings/730/Souvenir%20Sawed-Off%20%7C%20Snake%20Camo%20(Factory%20New)/render/?query=&start=0&count=100&currency=3",
    #     "https://steamcommunity.com/market/listings/730/AK-47%20%7C%20Neon%20Rider%20%28Battle-Scarred%29/render/?query=&start=0&count=100&currency=3",
    #     "https://steamcommunity.com/market/listings/730/Souvenir%20AWP%20%7C%20Pink%20DDPAT%20(Factory%20New)/render/?query=&start=0&count=100&currency=3",
    # ]

    # for url in url_list:
    #     print(url)
    #     t = threading.Thread(target=generateHTML, args=(url,))
    #     #t.daemon = True
    #     t.start()
    
    # generateHTML("https://steamcommunity.com/market/listings/730/AK-47%20%7C%20Black%20Laminate%20%28Battle-Scarred%29/render/?query=&start=0&count=100&currency=3")
