# کتابخانه‌های مورد نیاز
import datetime
import time
import threading
import tkinter as tk
from tkinter import messagebox
from tkinter import ttk
import jdatetime
import json
import queue

# تنظیمات فایل و ظاهر برنامه
FILE_NAME = "due_dates.json"
FONT_TITLE = ("Vazirmatn FD NL Bold", 14)
FONT_ENTRY = ("Vazirmatn FD NL Bold", 8)
FONT_BUTTON = ("Vazirmatn FD NL Bold", 8)
LABEL_COLOR = "#2c3e50"
BTN_COLOR = "#2980b9"
BTN_TEXT_COLOR = "white"
BG_COLOR = "#ecf0f1"

# متغیرهای سیستمی
alert_response_queue = queue.Queue()
stop_events = []
today_j = jdatetime.date.today()

# ------------------------ توابع اصلی ------------------------

def load_due_dates():
    try:
        with open(FILE_NAME, "r", encoding="utf-8") as f:
            return json.load(f)
    except:
        return []

def write_due_dates(data):
    with open(FILE_NAME, "w", encoding="utf-8") as f:
        json.dump(data, f, ensure_ascii=False, indent=4)

def check_due_date(due_date, stop_event):
    while not stop_event.is_set():
        if datetime.date.today() >= due_date:
            root.event_generate("<<ShowAlert>>", when="tail")
            res = alert_response_queue.get()
            if res is True:
                break
            elif res is False:
                time.sleep(3600)
            else:
                time.sleep(3600)
        else:
            time.sleep(3600)

def start_checking(due_date):
    ev = threading.Event()
    threading.Thread(target=check_due_date, args=(due_date, ev), daemon=True).start()
    return ev

def validate_dates(start_date, end_date, date_name):
    if start_date > end_date:
        messagebox.showerror("خطا", f"تاریخ {date_name} باید بعد از تاریخ شروع باشد.")
        return False
    return True

def validate_contract(parts):
    if len(parts) != 3:
        return False
    return all(part.isdigit() for part in parts)

def format_number(number):
    if isinstance(number, str):
        number = int(number.replace(",", ""))
    return "{:,}".format(number)

def on_number_change(var):
    def inner(*args):
        try:
            raw = var.get().replace(",", "")
            if raw:
                var.set(format_number(raw))
        except:
            pass
    return inner

# ------------------------ تابع ثبت اطلاعات ------------------------

def on_submit():
    # دریافت مقادیر (بدون تغییر)
    fields = [
        ("کد", entry_code.get()),
        ("نام شرکت", entry_company.get()),
        ("روز پرداخت", combo_payment_day.get()),
        ("ماه پرداخت", combo_payment_month.get()),
        ("سال پرداخت", combo_payment_year.get()),
        ("روز بازپرداخت", combo_repayment_day.get()),
        ("ماه بازپرداخت", combo_repayment_month.get()),
        ("سال بازپرداخت", combo_repayment_year.get()),
        ("شماره قرارداد قسمت سوم", entry_contract3.get()),
        ("شماره قرارداد قسمت دوم", entry_contract2.get()),
        ("شماره قرارداد قسمت اول", entry_contract1.get()),
        ("مبلغ وام", entry_loan.get().replace(",", "")),
        ("نرخ کارمزد", entry_fee_rate.get()),
        ("مدت", entry_duration.get()),
        ("مبلغ ضمانتنامه", entry_guarantee.get().replace(",", "")),
        ("سال سررسید", combo_due_year.get()),
        ("ماه سررسید", combo_due_month.get()),
        ("روز سررسید", combo_due_day.get()),
        ("بانک", combo_bank.get())
    ]

    # بررسی فیلدهای خالی (بدون تغییر)
    empty_fields = [name for name, value in fields if not value]
    if empty_fields:
        messagebox.showerror("خطا", f"لطفاً همه فیلدها را پر کنید.\nفیلدهای خالی: {', '.join(empty_fields)}")
        return
    
    # اعتبارسنجی شماره قرارداد (بدون تغییر)
    contract_parts = [fields[8][1], fields[9][1], fields[10][1]]
    if not validate_contract(contract_parts):
        messagebox.showerror("خطا", "شماره قرارداد باید شامل سه قسمت عددی باشد.")
        return

    # اعتبارسنجی مقادیر عددی (بدون تغییر)
    try:
        numbers = {
            "code": int(fields[0][1]),
            "loan_amount": int(fields[11][1]),
            "fee_rate": float(fields[12][1]),
            "duration": int(fields[13][1]),
            "guarantee_amount": int(fields[14][1])
        }
    except ValueError:
        messagebox.showerror("خطا", "مقادیر عددی وارد شده معتبر نیستند.")
        return
    
    # -------------------- اعتبارسنجی تاریخ‌ها --------------------
    try:
        # تاریخ سررسید (due)
        due_date = jdatetime.date(
            int(fields[15][1]),  # سال پرداخت (سال سررسید)
            int(fields[16][1]),  # ماه پرداخت (ماه سررسید)
            int(fields[17][1])   # روز پرداخت (روز سررسید)
        ).togregorian()
        
        # تاریخ بازپرداخت (repayment)
        repayment_date = jdatetime.date(
            int(fields[7][1]),  # سال بازپرداخت
            int(fields[6][1]),  # ماه بازپرداخت
            int(fields[5][1])   # روز بازپرداخت
        ).togregorian()
        
        # تاریخ پرداخت (payment)
        payment_date = jdatetime.date(
            int(fields[4][1]),  # سال سررسید
            int(fields[3][1]),  # ماه سررسید
            int(fields[2][1])   # روز سررسید
        ).togregorian()

        dates = {
            "due": due_date,
            "repayment": repayment_date,
            "payment": payment_date
        }
    except:
        messagebox.showerror("خطا", f"تاریخ وارد شده معتبر نیست. خطا: {str(e)}")
        return

    # بررسی روابط بین تاریخ‌ها (بدون تغییر)
    if dates["due"] < datetime.date.today():
        messagebox.showerror("خطا", "تاریخ سررسید باید امروز یا بعد از امروز باشد.")
        return

    if dates["repayment"] < datetime.date.today():
        messagebox.showerror("خطا", "تاریخ بازپرداخت باید امروز یا بعد از امروز باشد.")
        return

    if dates["payment"] >= dates["repayment"]:
        messagebox.showerror("خطا", "تاریخ پرداخت باید قبل از تاریخ بازپرداخت باشد.")
        return

    if dates["payment"] >= dates["due"]:
        messagebox.showerror("خطا", "تاریخ پرداخت باید قبل از تاریخ سررسید باشد.")
        return

    # ذخیره اطلاعات (بدون تغییر)
    data = load_due_dates()
    data.append({
        "bank": fields[18][1],
        "date_jalali": jdatetime.date(int(fields[15][1]), int(fields[16][1]), int(fields[17][1])).strftime("%Y/%m/%d"),
        "due_date": dates["due"].strftime("%Y-%m-%d"),
        "guarantee_amount": numbers["guarantee_amount"],
        "duration": numbers["duration"],
        "fee_rate": numbers["fee_rate"],
        "loan_amount": numbers["loan_amount"],
        "contract_number": "-".join(contract_parts),
        "repayment_date": dates["repayment"].strftime("%Y-%m-%d"),
        "payment_date": dates["payment"].strftime("%Y-%m-%d"),
        "company_name": fields[1][1],
        "code": numbers["code"],
    })
    
    write_due_dates(data)
    messagebox.showinfo("ثبت شد", "اطلاعات با موفقیت ثبت شدند.")
    stop_events.append(start_checking(dates["due"]))
    show_management_window()
    
# ------------------------ رابط کاربری ------------------------

root = tk.Tk()
root.title("مدیریت سررسیدها")
root.geometry("300x600")
root.configure(bg=BG_COLOR)
root.bind("<<ShowAlert>>", lambda e: alert_response_queue.put(messagebox.askyesno("هشدار", "تاریخ سررسید فرا رسیده است. آیا می‌خواهید هشدار متوقف شود؟")))

# فریم اصلی
main_frame = tk.Frame(root, bg=BG_COLOR)
main_frame.pack(fill="both", expand=True)

# تنظیمات کلید برای راست‌چین کردن
main_frame.grid_columnconfigure(0, weight=1)  # این خط فضای خالی سمت چپ را می‌گیرد
main_frame.grid_columnconfigure(1, weight=0)  # محتوا در این ستون قرار می‌گیرد

# فریم برای بخش عنوان
title_frame = tk.Frame(main_frame, bg=BG_COLOR)
title_frame.grid(row=0, column=0, columnspan=6, pady=10, sticky='we')
tk.Label(title_frame, text="ثبت اطلاعات جدید", font=FONT_TITLE, bg=BG_COLOR, fg=LABEL_COLOR).pack()

# فریم مستقل برای بخش کد
code_frame = tk.Frame(main_frame, bg=BG_COLOR)
code_frame.grid(row=1, column=3, sticky='e', padx=5, pady=5)

tk.Label(code_frame, text="کد", font=FONT_ENTRY, bg=BG_COLOR).grid(row=0, column=1, padx=5, sticky='ne')
entry_code = tk.Entry(code_frame, font=FONT_ENTRY, validate="key")
entry_code.grid(row=0, column=0, padx=5, sticky='ne')
entry_code.config(validatecommand=(root.register(lambda p: p.isdigit()), '%P'))

# فریم مستقل برای بخش نام شرکت
def is_persian(text):
    return all('\u0600' <= ch <= '\u06FF' or ch.isspace() for ch in text)

company_frame = tk.Frame(main_frame, bg=BG_COLOR)
company_frame.grid(row=2, column=3, sticky='e', padx=5, pady=5)

tk.Label(company_frame, text="نام شرکت", font=FONT_ENTRY, bg=BG_COLOR).grid(row=0, column=1, padx=5, sticky='e')
entry_company = tk.Entry(company_frame, font=FONT_ENTRY, validate="key")
entry_company.grid(row=0, column=0, padx=5, sticky='e')
entry_company.config(validatecommand=(root.register(lambda p: is_persian(p) or p == "", '%P')))

# فریم برای تاریخ پرداخت
payment_date_frame = tk.Frame(main_frame, bg=BG_COLOR)
payment_date_frame.grid(row=3, column=0, columnspan=4, sticky='e', padx=5, pady=5)

tk.Label(payment_date_frame, text="تاریخ پرداخت", font=FONT_ENTRY, bg=BG_COLOR).grid(row=0, column=3, padx=5, sticky='e')
combo_payment_day = ttk.Combobox(payment_date_frame, values=[str(d) for d in range(1,32)], font=FONT_ENTRY, width=3, state="readonly")
combo_payment_day.grid(row=0, column=2, padx=5, sticky='e')
combo_payment_month = ttk.Combobox(payment_date_frame, values=[str(m) for m in range(1,13)], font=FONT_ENTRY, width=3, state="readonly")
combo_payment_month.grid(row=0, column=1, padx=5, pady=5, sticky='e')
combo_payment_year = ttk.Combobox(payment_date_frame, values=[str(y) for y in range(today_j.year, today_j.year+11)], font=FONT_ENTRY, width=5, state="readonly")
combo_payment_year.grid(row=0, column=0, padx=5, sticky='e')

# فریم برای تاریخ بازپرداخت
repayment_date_frame = tk.Frame(main_frame, bg=BG_COLOR)
repayment_date_frame.grid(row=4, column=0, columnspan=4, sticky='e', padx=5, pady=5)

tk.Label(repayment_date_frame, text="تاریخ بازپرداخت", font=FONT_ENTRY, bg=BG_COLOR).grid(row=0, column=3, padx=5, pady=5, sticky='e')
combo_repayment_day = ttk.Combobox(repayment_date_frame, values=[str(d) for d in range(1,32)], font=FONT_ENTRY, width=3, state="readonly")
combo_repayment_day.grid(row=0, column=2, padx=5, sticky='e')
combo_repayment_month = ttk.Combobox(repayment_date_frame, values=[str(m) for m in range(1,13)], font=FONT_ENTRY, width=3, state="readonly")
combo_repayment_month.grid(row=0, column=1, padx=5, pady=5, sticky='e')
combo_repayment_year = ttk.Combobox(repayment_date_frame, values=[str(y) for y in range(today_j.year, today_j.year+11)], font=FONT_ENTRY, width=5, state="readonly")
combo_repayment_year.grid(row=0, column=0, padx=5, sticky='e')

# متغیر شماره قرارداد
contract_number = tk.StringVar()

# فریم مستقل برای بخش شماره قرارداد
contract_frame = tk.Frame(main_frame, bg=BG_COLOR)
contract_frame.grid(row=5, column=0, columnspan=6, sticky='e', padx=5, pady=5)

# اجزای شماره قرارداد
tk.Label(contract_frame, text="شماره قرارداد", font=FONT_ENTRY, bg=BG_COLOR).grid(row=0, column=5, padx=5, sticky='e')
entry_contract1 = tk.Entry(contract_frame, font=FONT_ENTRY, width=5, validate="key")
entry_contract1.grid(row=0, column=0, padx=2, sticky='e')
entry_contract1.config(validatecommand=(root.register(lambda p: p.isdigit()), '%P'))

tk.Label(contract_frame, text="-", font=FONT_ENTRY, bg=BG_COLOR).grid(row=0, column=1)
entry_contract2 = tk.Entry(contract_frame, font=FONT_ENTRY, width=5, validate="key")
entry_contract2.grid(row=0, column=2, padx=2, sticky='e')
entry_contract2.config(validatecommand=(root.register(lambda p: p.isdigit()), '%P'))

tk.Label(contract_frame, text="-", font=FONT_ENTRY, bg=BG_COLOR).grid(row=0, column=3)
entry_contract3 = tk.Entry(contract_frame, font=FONT_ENTRY, width=5, validate="key")
entry_contract3.grid(row=0, column=4, padx=2, sticky='e')
entry_contract3.config(validatecommand=(root.register(lambda p: p.isdigit()), '%P'))

# تابع برای به روزرسانی متغیر هنگام تغییر
def update_contract_number(*args):
    contract_number.set(f"{entry_contract1.get()}-{entry_contract2.get()}-{entry_contract3.get()}")

# ردیابی تغییرات در فیلدهای ورودی
entry_contract1.bind('<KeyRelease>', update_contract_number)
entry_contract2.bind('<KeyRelease>', update_contract_number)
entry_contract3.bind('<KeyRelease>', update_contract_number)

# متغیر مبلغ وام
loan_amount = tk.StringVar()

# فریم مستقل برای بخش مبلغ وام
loan_amount_frame = tk.Frame(main_frame, bg=BG_COLOR)
loan_amount_frame.grid(row=6, column=3, sticky='e', padx=5, pady=5)

# مبلغ وام
tk.Label(loan_amount_frame, text="مبلغ وام", font=FONT_ENTRY, bg=BG_COLOR).grid(row=6, column=1, padx=5, pady=5, sticky='e')
loan_amount = tk.StringVar()
loan_amount.set("0")
loan_amount.trace("w", on_number_change(loan_amount))
entry_loan = tk.Entry(loan_amount_frame, textvariable=loan_amount, font=FONT_ENTRY, validate="key")
entry_loan.grid(row=6, column=0, padx=5, pady=5, sticky='e')
entry_loan.config(validatecommand=(root.register(lambda p: p.replace(",","").isdigit()), '%P'))

# متغیر نرخ کارمزد
fee_rate = tk.StringVar()

# فریم مستقل برای بخش نرخ کارمزد
fee_rate_frame = tk.Frame(main_frame, bg=BG_COLOR)
fee_rate_frame.grid(row=7, column=3, sticky='e', padx=5, pady=5)

# نرخ کارمزد
tk.Label(fee_rate_frame, text="(%) نرخ کارمزد", font=FONT_ENTRY, bg=BG_COLOR).grid(row=7, column=1, padx=5, pady=5, sticky='e')
entry_fee_rate = tk.Entry(fee_rate_frame, font=FONT_ENTRY, validate="key")
entry_fee_rate.grid(row=7, column=0, padx=5, pady=5, sticky='e')
entry_fee_rate.config(validatecommand=(root.register(lambda p: p.replace(".","").isdigit()), '%P'))

# متغیر مدت
duration = tk.StringVar()

# فریم مستقل برای بخش مدت
duration_frame = tk.Frame(main_frame, bg=BG_COLOR)
duration_frame.grid(row=8, column=3, sticky='e', padx=5, pady=5)

# مدت
tk.Label(duration_frame, text="مدت (ماه)", font=FONT_ENTRY, bg=BG_COLOR).grid(row=8, column=1, padx=5, pady=5, sticky='e')
entry_duration = tk.Entry(duration_frame, font=FONT_ENTRY, validate="key")
entry_duration.grid(row=8, column=0, padx=5, pady=5, sticky='e')
entry_duration.config(validatecommand=(root.register(lambda p: p.isdigit()), '%P'))

# متغیر مبلغ ضمانتنامه
guarantee_var = tk.StringVar()

# فریم مستقل برای بخش مبلغ ضمانتنامه
guarantee_var_frame = tk.Frame(main_frame, bg=BG_COLOR)
guarantee_var_frame.grid(row=9, column=3, sticky='e', padx=5, pady=5)

# مبلغ ضمانتنامه
tk.Label(guarantee_var_frame, text="مبلغ ضمانتنامه", font=FONT_ENTRY, bg=BG_COLOR).grid(row=9, column=1, padx=5, pady=5, sticky='e')
guarantee_var = tk.StringVar()
guarantee_var.set("0")
guarantee_var.trace("w", on_number_change(guarantee_var))
entry_guarantee = tk.Entry(guarantee_var_frame, textvariable=guarantee_var, font=FONT_ENTRY, validate="key")
entry_guarantee.grid(row=9, column=0, padx=5, pady=5, sticky='e')
entry_guarantee.config(validatecommand=(root.register(lambda p: p.replace(",","").isdigit()), '%P'))

# متغیر تاریخ سررسید
due_date_var = tk.StringVar()

# فریم مستقل برای بخش تاریخ سررسید
due_date_var_frame = tk.Frame(main_frame, bg=BG_COLOR)
due_date_var_frame.grid(row=10, column=3, sticky='e', padx=5, pady=5)

# تاریخ سررسید
tk.Label(due_date_var_frame, text="تاریخ سررسید", font=FONT_ENTRY, bg=BG_COLOR).grid(row=10, column=3, padx=5, pady=5, sticky='e')
combo_due_day = ttk.Combobox(due_date_var_frame, values=[str(d) for d in range(1,32)], font=FONT_ENTRY, width=3, state="readonly")
combo_due_day.grid(row=10, column=2, padx=2, pady=5)
combo_due_month = ttk.Combobox(due_date_var_frame, values=[str(m) for m in range(1,13)], font=FONT_ENTRY, width=3, state="readonly")
combo_due_month.grid(row=10, column=1, padx=2, pady=5)
combo_due_year = ttk.Combobox(due_date_var_frame, values=[str(y) for y in range(today_j.year, today_j.year+11)], font=FONT_ENTRY, width=5, state="readonly")
combo_due_year.grid(row=10, column=0, padx=2, pady=5)

# متغیر بانک ها
bank_var = tk.StringVar()

# فریم مستقل برای بخش مبلغ ضمانتنامه
bank_var_frame = tk.Frame(main_frame, bg=BG_COLOR)
bank_var_frame.grid(row=11, column=3, sticky='e', padx=5, pady=5)

# بانک‌ها
bank_names = ["بانک ملی", "بانک سپه", "بانک ملت", "بانک تجارت", "بانک رفاه", 
              "بانک صادرات", "بانک کشاورزی", "بانک مسکن", "بانک صنعت و معدن", "بانک توسعه تعاون"]

tk.Label(bank_var_frame, text="بانک", font=FONT_ENTRY, bg=BG_COLOR).grid(row=11, column=1, padx=5, pady=5, sticky='e')
combo_bank = ttk.Combobox(bank_var_frame, values=bank_names, font=FONT_ENTRY, state="readonly")
combo_bank.grid(row=11, column=0, padx=5, pady=5, sticky='w')

# دکمه‌ها
btn_frame = tk.Frame(root, bg=BG_COLOR)
btn_frame.pack(pady=20)

btn_submit = tk.Button(btn_frame, text="ثبت اطلاعات", font=FONT_BUTTON, bg=BTN_COLOR, fg=BTN_TEXT_COLOR, command=on_submit)
btn_submit.pack(side='left', padx=10)

# ------------------------ مدیریت اطلاعات ------------------------

def show_management_window():
    # ایجاد پنجره جدید
    management_window = tk.Toplevel(root)
    management_window.title("مدیریت اطلاعات")
    management_window.geometry("1800x600")

    # فریم برای جدول و دکمه‌ها
    main_management_frame = tk.Frame(management_window)
    main_management_frame.pack(fill="both", expand=True, padx=10, pady=10)
    
    # فریم برای جدول
    tree_frame = tk.Frame(main_management_frame)
    tree_frame.pack(fill="both", expand=True)
    
    # ایجاد Treeview (جدول)
    tree = ttk.Treeview(management_window, columns=(
    "bank", "due_date", "guarantee_amount", 
    "duration", "fee_rate", "loan_amount", "contract_number",
    "repayment_date", "payment_date", "company_name", "code"
    ), show="headings")
    
    # تعریف ستون‌ها
    tree.heading("bank", text="بانک")
    tree.heading("due_date", text="تاریخ سررسید")
    tree.heading("guarantee_amount", text="مبلغ ضمانتنامه")
    tree.heading("duration", text="مدت")
    tree.heading("fee_rate", text="نرخ کارمزد")
    tree.heading("loan_amount", text="مبلغ وام")
    tree.heading("contract_number", text="شماره قرارداد")
    tree.heading("repayment_date", text="تاریخ بازپرداخت")
    tree.heading("payment_date", text="تاریخ پرداخت")
    tree.heading("company_name", text="نام شرکت")
    tree.heading("code", text="کد")
    
    # تنظیم عرض ستون‌ها
    tree.column("bank", width=100)
    tree.column("due_date", width=100)
    tree.column("guarantee_amount", width=100)
    tree.column("duration", width=50)
    tree.column("fee_rate", width=70)
    tree.column("loan_amount", width=100)
    tree.column("contract_number", width=100)
    tree.column("repayment_date", width=100)
    tree.column("payment_date", width=100)
    tree.column("company_name", width=150)
    tree.column("code", width=50)
    
    # اضافه کردن اسکرول بار
    scrollbar = ttk.Scrollbar(tree_frame, orient="vertical", command=tree.yview)
    tree.configure(yscrollcommand=scrollbar.set)
    scrollbar.pack(side="right", fill="y")
    tree.pack(side="left", fill="both", expand=True)

     # فریم برای دکمه‌ها
    button_frame = tk.Frame(main_management_frame)
    button_frame.pack(fill="x", pady=10)

    # دکمه حذف
    btn_delete = tk.Button(
        button_frame, 
        text="حذف انتخاب شده", 
        font=FONT_BUTTON, 
        bg="#e74c3c", 
        fg="white",
        command=lambda: delete_selected(tree)
    )
    btn_delete.pack(side="right", padx=10)
    
    # دکمه ویرایش
    btn_edit = tk.Button(
        button_frame, 
        text="ویرایش انتخاب شده", 
        font=FONT_BUTton, 
        bg="#f39c12", 
        fg="white",
        command=lambda: edit_selected(tree)
    )
    btn_edit.pack(side="right", padx=10)
    
    # دکمه بروزرسانی
    btn_refresh = tk.Button(
        button_frame,
        text="بروزرسانی لیست",
        font=FONT_BUTTON,
        bg=BTN_COLOR,
        fg="white",
        command=lambda: refresh_tree(tree)
    )
    btn_refresh.pack(side="left", padx=10)
    
    # بارگذاری اولیه داده‌ها
    refresh_tree(tree)
    
def delete_selected(tree):
    selected_item = tree.selection()
    if not selected_item:
        messagebox.showwarning("هشدار", "لطفاً یک مورد را انتخاب کنید.")
        return
    
    # دریافت کد قرارداد برای شناسایی رکورد
    item_data = tree.item(selected_item)
    contract_number = item_data['values'][6]  # شماره قرارداد در ستون 7
    
    # حذف از فایل
    data = load_due_dates()
    data = [item for item in data if item["contract_number"] != contract_number]
    write_due_dates(data)
    
    # حذف از Treeview
    tree.delete(selected_item)
    messagebox.showinfo("موفق", "رکورد با موفقیت حذف شد.")

def edit_selected(tree):
    selected_item = tree.selection()
    if not selected_item:
        messagebox.showwarning("هشدار", "لطفاً یک مورد را انتخاب کنید.")
        return
    
    # ایجاد پنجره ویرایش
    edit_window = tk.Toplevel(root)
    edit_window.title("ویرایش اطلاعات")
    edit_window.geometry("400x600")
    
    # دریافت داده‌های انتخاب شده
    item_data = tree.item(selected_item)
    values = item_data['values']
    
    # ایجاد فرم ویرایش (شبیه فرم اصلی)
    # این بخش باید شبیه فرم اصلی باشد، اما با مقادیر پیش‌فرض
    # برای سادگی، فقط یک مثال ساده می‌آوریم:
    
    tk.Label(edit_window, text="مبلغ وام:", font=FONT_ENTRY).pack()
    loan_entry = tk.Entry(edit_window, font=FONT_ENTRY)
    loan_entry.pack()
    loan_entry.insert(0, values[5])  # مقدار فعلی
    
    # دکمه ذخیره تغییرات
    def save_changes():
        # دریافت مقادیر جدید و اعمال تغییرات
        new_loan = loan_entry.get()
        
        # به‌روزرسانی داده‌ها
        data = load_due_dates()
        for item in data:
            if item["contract_number"] == values[6]:  # شماره قرارداد
                item["loan_amount"] = int(new_loan.replace(",", ""))
                break
        
        write_due_dates(data)
        messagebox.showinfo("موفق", "تغییرات با موفقیت ذخیره شد.")
        edit_window.destroy()
        refresh_tree(tree)  # بروزرسانی جدول
    
    tk.Button(
        edit_window, 
        text="ذخیره تغییرات", 
        font=FONT_BUTTON, 
        bg=BTN_COLOR, 
        fg="white",
        command=save_changes
    ).pack(pady=20)

def refresh_tree(tree):
    # پاک کردن داده‌های فعلی
    for item in tree.get_children():
        tree.delete(item)
    
    # بارگذاری مجدد داده‌ها
    data = load_due_dates()
    for item in data:
        tree.insert("", "end", values=(
            item["bank"],
            item["date_jalali"],  # تغییر از gregorian_to_jalali(item["date_gregorian"])
            format_number(item["guarantee_amount"]),
            item["duration"],
            item["fee_rate"],
            format_number(item["loan_amount"]),
            item["contract_number"],
            gregorian_to_jalali(item["repayment_date"]),
            gregorian_to_jalali(item["payment_date"]),
            item["company_name"],
            item["code"]
        ))

    # بارگذاری داده‌ها
    data = load_due_dates()
    for item in data:
        tree.insert("", "end", values=(
            item["bank"],
            gregorian_to_jalali(item["date_gregorian"]),
            format_number(item["guarantee_amount"]),
            item["duration"],
            item["fee_rate"],
            format_number(item["loan_amount"]),
            item["contract_number"],
            gregorian_to_jalali(item["repayment_date"]),
            gregorian_to_jalali(item["payment_date"]),
            item["company_name"],
            item["code"]
        ))
        
def gregorian_to_jalali(date_str):
    try:
        # تبدیل رشته تاریخ میلادی به شیء تاریخ
        date_part = date_str.split()[0]
        g_date = datetime.datetime.strptime(date_part, "%Y-%m-%d").date()
        j_date = jdatetime.date.fromgregorian(date=g_date)
        return j_date.strftime("%Y/%m/%d")
    except:
        return date_str  # در صورت بروز خطا، تاریخ اصلی را برگردان
    
    
    
btn_manage = tk.Button(btn_frame, text="مدیریت اطلاعات", font=FONT_BUTTON, bg=BTN_COLOR, fg=BTN_TEXT_COLOR, command=show_management_window)
btn_manage.pack(side='left', padx=10)

root.mainloop()
ایرادات الگوی بالا رو با راهکارها بگو