import os
import pymysql
import sys

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

# DB Připojení
DB_HOST = "192.168.1.76"
DB_PORT = 3307  # Port pro tvou DB
DB_USER = "root"
DB_PASS = "Vlado9674+"  # Tvé heslo
DB_NAME = "torrents"
DB_TABLE = "file_md5_index"
REMOTE_SHARE_KEY = "#ColdData"


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

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:
        print(f"❌ CHYBA: Nelze se připojit k MySQL na {DB_HOST}:{DB_PORT}.")
        print(f"   Detail: {e}")
        sys.exit(1)


def normalize_path(path):
    """
    1. Převede Windows '\\' na Linux '/'
    2. Převede vše na malá písmena (aby 'Foto.jpg' == 'foto.JPG')
    """
    return path.replace("\\", "/").lower()


def get_local_files(root_path):
    print(f"📂 Skenuji lokální disk: {root_path}")
    local_files = set()

    if not os.path.exists(root_path):
        print(f"❌ Chyba: Cesta {root_path} neexistuje.")
        return local_files

    count = 0
    for root, dirs, files in os.walk(root_path):
        # Ignorovat systémové složky Syncthingu
        if ".stfolder" in dirs: dirs.remove(".stfolder")
        if ".stversions" in dirs: dirs.remove(".stversions")

        for file in files:
            full_path = os.path.join(root, file)

            try:
                rel_path = os.path.relpath(full_path, root_path)
            except ValueError:
                continue

            # NORMALIZACE (Lomítka + Malá písmena)
            clean_path = normalize_path(rel_path)

            local_files.add(clean_path)
            count += 1

            if count % 1000 == 0:
                print(f"   ... načteno {count} lokálních souborů ...", end="\r")

    print(f"✅ Lokálně nalezeno: {len(local_files):,} souborů.")
    return local_files


def get_remote_files_from_db():
    print(f"📡 Připojuji se k DB '{DB_NAME}' a stahuji seznam...")
    conn = get_db_connection()
    remote_files = set()

    try:
        with conn.cursor() as cursor:
            sql = f"SELECT full_path FROM {DB_TABLE} WHERE full_path LIKE %s"
            cursor.execute(sql, (f"%/{REMOTE_SHARE_KEY}/%",))

            rows = cursor.fetchall()
            print(f"   ... DB vrátila {len(rows):,} řádků. Zpracovávám...")

            for row in rows:
                full_path_db = row['full_path']

                if f"/{REMOTE_SHARE_KEY}/" in full_path_db:
                    parts = full_path_db.split(f"/{REMOTE_SHARE_KEY}/")
                    if len(parts) > 1:
                        rel_path = parts[1]

                        # NORMALIZACE (Lomítka + Malá písmena)
                        clean_path = normalize_path(rel_path)
                        remote_files.add(clean_path)

    finally:
        conn.close()

    print(f"✅ V DB nalezeno: {len(remote_files):,} unikátních cest.")
    return remote_files


def main():
    print("🚀 HLEDÁNÍ DUPLIKÁTŮ (Case Insensitive)")
    print("=======================================")

    local_set = get_local_files(LOCAL_ROOT)
    remote_set = get_remote_files_from_db()

    print("\n🔍 Porovnávám (všechna písmena ignorují velikost)...")

    # Průnik
    duplicates = local_set.intersection(remote_set)
    only_local = local_set - remote_set

    print("\n📊 VÝSLEDKY")
    print("=======================================")
    print(f"🏠 Celkem lokálně:      {len(local_set):,}")
    print(f"☁️  Celkem v DB:         {len(remote_set):,}")
    print("---------------------------------------")
    print(f"👯 SHODA (DUPLIKÁTY):   {len(duplicates):,}")
    print(f"🆕 UNIKÁTNÍ (JEN DOMA): {len(only_local):,}")
    print("=======================================\n")

    if duplicates:
        file_dup = "report_DUPLIKATY.txt"
        with open(file_dup, "w", encoding="utf-8") as f:
            for item in sorted(duplicates):
                f.write(f"{item}\n")
        print(f"💾 Seznam duplikátů (malá písmena) uložen do: {file_dup}")

    if only_local:
        file_new = "report_NOVE_SOUBORY.txt"
        with open(file_new, "w", encoding="utf-8") as f:
            for item in sorted(only_local):
                f.write(f"{item}\n")
        print(f"💾 Seznam nových souborů uložen do: {file_new}")

    input("\nStiskni ENTER pro ukončení...")


if __name__ == "__main__":
    main()