import os
import pymysql
import sys
import json
from tqdm import tqdm

# ==============================
# ⚙️ NASTAVENÍ
# ==============================
CACHE_FILE = "local_hashes.jsonl"

# !!! ZMĚŇ NA True PRO SKUTEČNÉ MAZÁNÍ !!!
DELETE_MODE = True

# Filtr DB (Hledáme shodu jen v této složce na serveru)
REMOTE_FOLDER_FILTER = "/#ColdData/Porno/"

DB_CONFIG = {
    "host": "192.168.1.76",
    "port": 3307,
    "user": "root",
    "password": "Vlado9674+",
    "database": "torrents",
}


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

def get_remote_hashes():
    print("📡 Stahuji hashe z DB (filtr: " + REMOTE_FOLDER_FILTER + ")...")
    hashes = set()
    try:
        conn = pymysql.connect(**DB_CONFIG, cursorclass=pymysql.cursors.DictCursor)
        with conn.cursor() as cursor:
            # Stáhneme hashe souborů, které jsou v cílové složce
            sql = f"SELECT blake3 FROM file_md5_index WHERE full_path LIKE %s"
            cursor.execute(sql, (f"%{REMOTE_FOLDER_FILTER}%",))

            for row in cursor.fetchall():
                # DB vrací bytes, my potřebujeme HEX string (stejný jako v JSONL)
                hashes.add(row['blake3'].hex())
        conn.close()
    except Exception as e:
        sys.exit(f"❌ Chyba DB: {e}")
    return hashes


def count_lines(filename):
    """Spočítá řádky pro progress bar"""
    print("⏳ Sčítám záznamy v cache...", end="\r")
    with open(filename, "r", encoding="utf-8") as f:
        return sum(1 for _ in f)


def main():
    print("🚀 KROK 2: Terminátor (Mazání podle cache)")
    print(f"📂 Cache soubor: {CACHE_FILE}")
    print(f"🛠  Mód: {'🔴 OSTRÝ (MAZÁNÍ)' if DELETE_MODE else '🟢 SIMULACE (JEN VÝPIS)'}")
    print("===================================")

    if not os.path.exists(CACHE_FILE):
        sys.exit("❌ Cache soubor neexistuje! Spusť nejdřív KROK 1.")

    # 1. Stáhnout DB
    remote_hashes = get_remote_hashes()
    print(f"✅ DB načtena: {len(remote_hashes):,} unikátních hashů ze serveru.")

    # 2. Spočítat řádky pro progress bar
    total_lines = count_lines(CACHE_FILE)
    print(f"✅ Cache obsahuje: {total_lines:,} lokálních souborů ke kontrole.")

    print("🔍 Jdu porovnávat...")

    count_deleted = 0
    freed_space = 0
    errors = 0

    # Otevření souboru pro logování smazaných (volitelné)
    log_name = "deleted_files.log" if DELETE_MODE else "would_delete.log"

    with open(CACHE_FILE, "r", encoding="utf-8") as f_in, \
            open(log_name, "w", encoding="utf-8") as f_log:

        # Progress bar
        with tqdm(total=total_lines, unit="file", dynamic_ncols=True) as pbar:

            for line in f_in:
                pbar.update(1)
                line = line.strip()
                if not line: continue

                try:
                    data = json.loads(line)
                    local_hash = data["h"]
                    file_path = data["p"]
                except:
                    continue  # Vadný řádek

                # Kontrola existence souboru (mohli jsme ho už smazat ručně)
                if not os.path.exists(file_path):
                    continue

                # --- HLAVNÍ LOGIKA ---
                if local_hash in remote_hashes:
                    # SHODA! Soubor je na serveru -> SMAZAT lokálně

                    try:
                        size = os.path.getsize(file_path)

                        if DELETE_MODE:
                            os.remove(file_path)
                            status = "SMAZÁNO"
                            # Pokus o smazání prázdné složky
                            try:
                                os.rmdir(os.path.dirname(file_path))
                            except:
                                pass
                        else:
                            status = "NAŠEL BYCH"

                        count_deleted += 1
                        freed_space += size

                        # Zápis do logu
                        f_log.write(f"{file_path}\n")

                        # Aktualizace popisku (jen občas, aby to neblikalo moc rychle)
                        if count_deleted % 10 == 0:
                            pbar.set_description(f"Mazání: {count_deleted} files")

                    except OSError as e:
                        errors += 1
                        # print(f"❌ Chyba u {file_path}: {e}")

    print("\n\n📊 VÝSLEDEK")
    print("===================================")
    print(f"🔎 Zkontrolováno:  {total_lines:,}")
    print(f"🗑️  {'Smazáno' if DELETE_MODE else 'K smazání'}:      {count_deleted:,}")
    print(f"💾 Ušetřeno místo: {freed_space / (1024 * 1024 * 1024):.2f} GB")
    print(f"📝 Seznam souborů: '{log_name}'")

    if errors > 0:
        print(f"⚠️ Chyb při mazání: {errors}")

    if not DELETE_MODE and count_deleted > 0:
        print("\n💡 LÍBÍ SE TI VÝSLEDEK? Změň nahoře: DELETE_MODE = True")


if __name__ == "__main__":
    main()