import os
import pymysql
import sys

# ==============================
# ⚙️ NASTAVENÍ
# ==============================
LOCAL_ROOT = r"U:\#Syncthing"

# Cíl, kam to chceš nahrát (pro kontrolu přesné shody)
TARGET_SUBFOLDER = "Porno"
REMOTE_SHARE_KEY = "#ColdData"

# DB Nastavení
DB_HOST = "192.168.1.76"
DB_PORT = 3307
DB_USER = "root"
DB_PASS = "Vlado9674+"
DB_NAME = "torrents"
DB_TABLE = "file_md5_index"


# ==============================

def get_db_connection():
    try:
        return pymysql.connect(
            host=DB_HOST, port=DB_PORT, user=DB_USER, password=DB_PASS,
            database=DB_NAME, cursorclass=pymysql.cursors.DictCursor
        )
    except Exception as e:
        sys.exit(f"❌ Chyba DB: {e}")


def normalize_path(path):
    return path.replace("\\", "/").lower()


def main():
    print(f"🚀 KŘÍŽOVÁ KONTROLA (Co nahrát vs. Co už někde je)")
    print("=====================================================")

    # 1. NAČÍST CELOU DB (pro hledání zatoulaných souborů)
    print("📡 Stahuji kompletní index serveru (Jméno + Velikost)...")

    # Mapa: (jmeno, velikost) -> [seznam cest]
    global_map = {}

    conn = get_db_connection()
    with conn.cursor() as cursor:
        # Stáhneme vše z #ColdData
        sql = f"SELECT file_name, file_size, full_path FROM {DB_TABLE} WHERE full_path LIKE %s"
        cursor.execute(sql, (f"%/{REMOTE_SHARE_KEY}/%",))
        rows = cursor.fetchall()

        for row in rows:
            fname = row['file_name'].lower()
            size = row['file_size']
            path = row['full_path']

            key = (fname, size)
            if key not in global_map:
                global_map[key] = []
            global_map[key].append(path)

    print(f"✅ Index načten ({len(rows):,} souborů).")

    # 2. DEFINICE CÍLOVÉ CESTY (pro kontrolu přesné shody)
    # Cesta v DB vypadá např: /mnt/disk1/#ColdData/Porno/Slozka/Film.avi
    # My budeme kontrolovat, jestli soubor už je v "cílové logické cestě"
    target_pattern_part = f"/{REMOTE_SHARE_KEY}/{TARGET_SUBFOLDER}/".lower()

    # 3. SKENOVÁNÍ LOKÁLNÍHO DISKU
    print(f"📂 Skenuji {LOCAL_ROOT} a třídím...")

    count_upload = 0
    count_move = 0
    count_ok = 0

    f_upload = open("1_NAHRAT_NA_SERVER.txt", "w", encoding="utf-8")
    f_move = open("2_JIZ_EXISTUJI_JINDE.txt", "w", encoding="utf-8")

    f_upload.write("TOTO JSOU DATA, KTERÁ NA SERVERU VŮBEC NEJSOU:\n")
    f_move.write("TOTO NAHRAJEŠ ZBYTEČNĚ (Už to tam je, ale v jiné složce):\n")

    for root, dirs, files in os.walk(LOCAL_ROOT):
        if ".stfolder" in dirs: dirs.remove(".stfolder")
        if ".stversions" in dirs: dirs.remove(".stversions")

        for filename in files:
            fname_lower = filename.lower()
            local_full_path = os.path.join(root, filename)

            try:
                local_size = os.path.getsize(local_full_path)
                # Relativní cesta, kam bys to nahrál (např. Herci/Film.avi)
                rel_path = os.path.relpath(local_full_path, LOCAL_ROOT)
                clean_rel_path = normalize_path(rel_path)
            except OSError:
                continue

            key = (fname_lower, local_size)

            # --- LOGIKA ROZHODOVÁNÍ ---

            if key in global_map:
                # Soubor (stejné jméno a velikost) na serveru EXISTUJE.
                # Otázka je: Je ve správné složce?

                server_paths = global_map[key]
                is_in_target = False

                # Zkontrolujeme, zda alespoň jedna cesta na serveru odpovídá té, kam to chceš nahrát
                # Tedy jestli obsahuje /#ColdData/Porno/ + tvoji relativní cestu

                # Hledaný koncový řetězec: "porno/herci/film.avi"
                target_suffix = f"{TARGET_SUBFOLDER}/{clean_rel_path}".lower()

                for path in server_paths:
                    if path.lower().endswith(target_suffix):
                        is_in_target = True
                        break

                if is_in_target:
                    # Je to tam, kde to má být.
                    count_ok += 1
                else:
                    # Je to na serveru, ale JINDE.
                    count_move += 1
                    f_move.write(f"SOUBOR: {clean_rel_path}\n")
                    f_move.write(f"   >>> Nalezen jinde: {server_paths[0]}\n")
            else:
                # Na serveru není vůbec (ani jinde).
                count_upload += 1
                f_upload.write(f"{local_full_path}\n")

            if (count_upload + count_move + count_ok) % 1000 == 0:
                print(f"   ... zpracováno {count_upload + count_move + count_ok} ...", end="\r")

    f_upload.close()
    f_move.close()

    print("\n\n📊 FINÁLNÍ REPORT")
    print("=====================================================")
    print(f"✅ UŽ TAM JE (Správně):     {count_ok:,}")
    print(f"📦 UŽ TAM JE (Ale jinde):   {count_move:,} -> Koukni do 2_JIZ_EXISTUJI_JINDE.txt")
    print(f"🚀 MUSÍŠ NAHRÁT (Nové):     {count_upload:,} -> Seznam v 1_NAHRAT_NA_SERVER.txt")
    print("=====================================================")


if __name__ == "__main__":
    main()