from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

from pymongo import MongoClient
from datetime import datetime
import time
import sys


try:
    client = MongoClient("mongodb://tradeir_7trade:S1]0gj1Dnm6K*H@136.243.36.77:27017/tradeir_7trade")
    client.admin.command("ping")

    print("MongoDB Connected")

except Exception as e:
    print("MongoDB Error:", e)
    sys.exit()

db = client["tradeir_7trade"]


coins_collection = db["coins"]


history_collection = db["forex"]

def get_top20_assets():

    rows = wait.until(
        EC.presence_of_all_elements_located(
            (By.CSS_SELECTOR, "tbody tr")
        )
    )

    assets = []

    for row in rows[:20]:

        try:

            name = row.find_element(
                By.CSS_SELECTOR,
                "span.asset-item-name"
            ).text.strip()

            price_text = row.find_element(
                By.CSS_SELECTOR,
                "span.asset-price"
            ).text.strip()

            price = float(
                price_text
                .replace("$", "")
                .replace(",", "")
            )

            assets.append({
                "type": "commodity",
                "symbol": name,
                "price": price,
                "updated_at": datetime.now(),
                "isDeleted": False
            })

        except Exception as e:
            print("Row Error:", e)

    return assets


def save_to_mongo(assets):

    for asset in assets:

        old_asset = coins_collection.find_one(
            {"symbol": asset["symbol"]}
        )

        if (
            old_asset is None
            or old_asset["price"] != asset["price"]
        ):

            coins_collection.update_one(
                {"symbol": asset["symbol"]},
                {
                    "$set": {
                        "type": "commodity",
                        "symbol": asset["symbol"],
                        "price": asset["price"],
                        "updated_at": asset["updated_at"],
                        "isDeleted": False
                    }
                },
                upsert=True
            )

            history_collection.insert_one({
                "type": "commodity",
                "symbol": asset["symbol"],
                "price": asset["price"],
                "createdAt": asset["updated_at"],
                "isDeleted": False
            })

            print(
                f"UPDATED => {asset['symbol']} : {asset['price']}"
            )

CHROMEDRIVER_PATH = r"C:\Users\Padidar\Desktop\chromedriver-win64\chromedriver-win64\chromedriver.exe"

PROFILE_PATH = r"C:\chrome_profiles"
PROFILE_NAME = "trade"

options = Options()

options.add_argument(f"--user-data-dir={PROFILE_PATH}")
options.add_argument(f"--profile-directory={PROFILE_NAME}")

options.add_argument("--start-maximized")
options.add_argument("--disable-gpu")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")

driver = webdriver.Chrome(
    service=Service(CHROMEDRIVER_PATH),
    options=options
)

wait = WebDriverWait(driver, 20)

driver.get(
    "https://coinmarketcap.com/real-world-assets/?type=rwa"
)


wait.until(
    EC.presence_of_element_located(
        (
            By.CSS_SELECTOR,
            "tbody tr"
        )
    )
)

time.sleep(5)
row = driver.find_element(By.CSS_SELECTOR, "tbody tr")

print("=" * 100)
print(row.get_attribute("outerHTML"))
print("=" * 100)
while True:

    try:
        time.sleep(1)

        driver.refresh()

        wait.until(
            EC.presence_of_element_located(
                (
                    By.CSS_SELECTOR,
                    "tbody tr"
                )
            )
        )

        time.sleep(0.5)

        assets = get_top20_assets()

        save_to_mongo(assets)

        print(datetime.now())

        for asset in assets:
            print(
                f"{asset['symbol']} => {asset['price']}"
            )


        time.sleep(0.5)

    except Exception as e:

        print("MAIN LOOP ERROR:", e)

        time.sleep(1)

