import os
import sys
import json
import csv
import tkinter as tk
from tkinter import filedialog, messagebox
from openpyxl import Workbook
from openpyxl.worksheet.table import Table, TableStyleInfo

# ==================================================
# הגדרות
# ==================================================
DEFAULT_PATH = r"C:\אוצריא\אוצריא\אודות התוכנה\SourcesBooks.csv"
REQUIRED_NAME = "SourcesBooks.csv"
CONFIG_PATH = os.path.join(os.getenv("APPDATA", os.getcwd()), "sourcesbooks_config.json")
OUTPUT_XLSX = os.path.join(os.path.expanduser("~"), "Desktop", "רשימת_ספרים.xlsx")  # שמירה על שולחן העבודה

# טען רשימת חיתוך חיצונית (אפשר לערוך cut_words.json)
CUT_WORDS_FILE = "cut_words.json"
if os.path.isfile(CUT_WORDS_FILE):
    with open(CUT_WORDS_FILE, encoding="utf-8") as f:
        data = json.load(f)
        CUT_WORDS = data.get("cut_words", [])
else:
    # ברירת מחדל אם אין קובץ חיצוני
    CUT_WORDS = [" על ", " חלק ", " שולחן ", "-", "מסכת"]

# ==================================================
# איתור הקובץ
# ==================================================
def load_saved_path():
    if os.path.isfile(CONFIG_PATH):
        try:
            with open(CONFIG_PATH, encoding="utf-8") as f:
                data = json.load(f)
                path = data.get("path")
                if path and os.path.isfile(path):
                    return path
        except Exception:
            pass
    return None

def save_path(path):
    os.makedirs(os.path.dirname(CONFIG_PATH), exist_ok=True)
    with open(CONFIG_PATH, "w", encoding="utf-8") as f:
        json.dump({"path": path}, f, ensure_ascii=False, indent=2)

def choose_file():
    root = tk.Tk()
    root.withdraw()
    messagebox.showinfo(
        "בחירת קובץ",
        f'הקובץ "{REQUIRED_NAME}" לא נמצא.\n\n'
        f'אנא נווט לקובץ בשם "{REQUIRED_NAME}"'
    )

    while True:
        path = filedialog.askopenfilename(
            title=f'בחר את הקובץ "{REQUIRED_NAME}"',
            filetypes=[("CSV files", "*.csv"), ("All files", "*.*")]
        )
        if not path:
            messagebox.showerror("בוטל", "לא נבחר קובץ. התוכנית תיסגר.")
            sys.exit(1)
        if os.path.basename(path) != REQUIRED_NAME:
            messagebox.showerror("שם קובץ שגוי", f"נדרש לבחור קובץ בשם:\n{REQUIRED_NAME}")
            continue
        return path

def locate_sourcesbooks():
    if os.path.isfile(DEFAULT_PATH):
        save_path(DEFAULT_PATH)
        return DEFAULT_PATH
    saved = load_saved_path()
    if saved:
        return saved
    chosen = choose_file()
    save_path(chosen)
    return chosen

# ==================================================
# ניקוי שם ספר לפי CUT_WORDS + מסכת + "-"
# ==================================================
def clean_title(title: str) -> str:
    t = title
    # חיתוך לפי CUT_WORDS
    first_idx = len(t)
    for w in CUT_WORDS:
        idx = t.find(w)
        if idx != -1 and idx < first_idx:
            first_idx = idx
    t = t[:first_idx].strip()

    # חיתוך לפי "מסכת" אם היא מופיעה כמילה שלישית
    words_after_cut = t.split()
    if len(words_after_cut) >= 3 and "מסכת" in CUT_WORDS and words_after_cut[2] == "מסכת":
        t = " ".join(words_after_cut[:2]).strip()

    return t

# ==================================================
# קריאה וייצוא לאקסל (בלי טור מקור הקובץ)
# ==================================================
def export_to_excel(csv_path):
    books_set = set()
    books_list = []

    with open(csv_path, encoding="utf-8", newline="") as f:
        reader = csv.reader(f)
        for row in reader:
            if not row:
                continue
            raw = row[0].strip()
            if raw:
                clean_name = clean_title(raw)
                if clean_name not in books_set:
                    books_set.add(clean_name)
                    books_list.append({
                        "name": clean_name,
                        "file_path": os.path.dirname(csv_path)
                    })

    books_list.sort(key=lambda x: x["name"])

    wb = Workbook()
    ws = wb.active
    ws.title = "ספרים"

    # הגדרת כיוון מימין לשמאל
    ws.sheet_view.rightToLeft = True

    # כותרות
    ws.append(["מספר", "שם הספר", "נתיב הקובץ"])

    for i, book in enumerate(books_list, start=1):
        ws.append([i, book["name"], book["file_path"]])

    table = Table(displayName="BooksTable", ref=f"A1:C{len(books_list)+1}")
    style = TableStyleInfo(
        name="TableStyleMedium9",
        showFirstColumn=False,
        showLastColumn=False,
        showRowStripes=True,
        showColumnStripes=False
    )
    table.tableStyleInfo = style
    ws.add_table(table)

    # רוחב עמודות מותאם
    ws.column_dimensions["A"].width = 8
    ws.column_dimensions["B"].width = 55
    ws.column_dimensions["C"].width = 80

    wb.save(OUTPUT_XLSX)

# ==================================================
# MAIN
# ==================================================
if __name__ == "__main__":
    sourcesbooks_path = locate_sourcesbooks()
    print("✔ נמצא הקובץ:", sourcesbooks_path)

    export_to_excel(sourcesbooks_path)
    print(f"✔ נוצר קובץ אקסל: {OUTPUT_XLSX}")

    input("\nסיום – לחץ Enter כדי לצאת")
