import tkinter as tk
from tkinter import messagebox
from tkinter.filedialog import asksaveasfilename
from datetime import datetime, timedelta
from openpyxl import Workbook
import os
import webbrowser
from tkinter import ttk

def faiz_araliklari_olustur(ardisik_tarih=True):
    if ardisik_tarih:
        return [
            ((datetime.strptime('08.03.1994', '%d.%m.%Y'), datetime.strptime('30.08.1995', '%d.%m.%Y')), 1.44),
            ((datetime.strptime('31.08.1995', '%d.%m.%Y'), datetime.strptime('31.01.1996', '%d.%m.%Y')), 1.20),
            ((datetime.strptime('01.02.1996', '%d.%m.%Y'), datetime.strptime('08.07.1998', '%d.%m.%Y')), 1.80),
            ((datetime.strptime('09.07.1998', '%d.%m.%Y'), datetime.strptime('20.01.2000', '%d.%m.%Y')), 1.44),
            ((datetime.strptime('21.01.2000', '%d.%m.%Y'), datetime.strptime('01.12.2000', '%d.%m.%Y')), 0.72),
            ((datetime.strptime('02.12.2000', '%d.%m.%Y'), datetime.strptime('28.03.2001', '%d.%m.%Y')), 0.60),
            ((datetime.strptime('29.03.2001', '%d.%m.%Y'), datetime.strptime('30.01.2002', '%d.%m.%Y')), 1.20),
            ((datetime.strptime('31.01.2002', '%d.%m.%Y'), datetime.strptime('11.11.2003', '%d.%m.%Y')), 0.84),
            ((datetime.strptime('12.11.2003', '%d.%m.%Y'), datetime.strptime('01.03.2005', '%d.%m.%Y')), 0.48),
            ((datetime.strptime('02.03.2005', '%d.%m.%Y'), datetime.strptime('20.04.2006', '%d.%m.%Y')), 0.36),
            ((datetime.strptime('21.04.2006', '%d.%m.%Y'), datetime.strptime('18.11.2009', '%d.%m.%Y')), 0.30),
            ((datetime.strptime('19.11.2009', '%d.%m.%Y'), datetime.strptime('18.10.2010', '%d.%m.%Y')), 0.234),
            ((datetime.strptime('19.10.2010', '%d.%m.%Y'), datetime.strptime('03.09.2018', '%d.%m.%Y')), 0.168),
            ((datetime.strptime('04.09.2018', '%d.%m.%Y'), datetime.strptime('30.06.2019', '%d.%m.%Y')), 0.24),
            ((datetime.strptime('01.07.2019', '%d.%m.%Y'), datetime.strptime('01.10.2019', '%d.%m.%Y')), 0.30),
            ((datetime.strptime('02.10.2019', '%d.%m.%Y'), datetime.strptime('29.12.2019', '%d.%m.%Y')), 0.24),
            ((datetime.strptime('30.12.2019', '%d.%m.%Y'), datetime.strptime('20.07.2022', '%d.%m.%Y')), 0.192),
            ((datetime.strptime('21.07.2022', '%d.%m.%Y'), datetime.strptime('13.11.2023', '%d.%m.%Y')), 0.30),
            ((datetime.strptime('14.11.2023', '%d.%m.%Y'), datetime.strptime('20.05.2024', '%d.%m.%Y')), 0.42),
            ((datetime.strptime('21.05.2024', '%d.%m.%Y'), datetime.max), 0.54)
        ]
    else:
        return [
            ((datetime.strptime('08.03.1994', '%d.%m.%Y'), datetime.strptime('30.08.1995', '%d.%m.%Y')), 1.44),
            ((datetime.strptime('30.08.1995', '%d.%m.%Y'), datetime.strptime('31.01.1996', '%d.%m.%Y')), 1.20),
            ((datetime.strptime('31.01.1996', '%d.%m.%Y'), datetime.strptime('08.07.1998', '%d.%m.%Y')), 1.80),
            ((datetime.strptime('08.07.1998', '%d.%m.%Y'), datetime.strptime('20.01.2000', '%d.%m.%Y')), 1.44),
            ((datetime.strptime('20.01.2000', '%d.%m.%Y'), datetime.strptime('01.12.2000', '%d.%m.%Y')), 0.72),
            ((datetime.strptime('01.12.2000', '%d.%m.%Y'), datetime.strptime('28.03.2001', '%d.%m.%Y')), 0.60),
            ((datetime.strptime('28.03.2001', '%d.%m.%Y'), datetime.strptime('30.01.2002', '%d.%m.%Y')), 1.20),
            ((datetime.strptime('30.01.2002', '%d.%m.%Y'), datetime.strptime('11.11.2003', '%d.%m.%Y')), 0.84),
            ((datetime.strptime('11.11.2003', '%d.%m.%Y'), datetime.strptime('01.03.2005', '%d.%m.%Y')), 0.48),
            ((datetime.strptime('01.03.2005', '%d.%m.%Y'), datetime.strptime('20.04.2006', '%d.%m.%Y')), 0.36),
            ((datetime.strptime('20.04.2006', '%d.%m.%Y'), datetime.strptime('18.11.2009', '%d.%m.%Y')), 0.30),
            ((datetime.strptime('18.11.2009', '%d.%m.%Y'), datetime.strptime('18.10.2010', '%d.%m.%Y')), 0.234),
            ((datetime.strptime('18.10.2010', '%d.%m.%Y'), datetime.strptime('03.09.2018', '%d.%m.%Y')), 0.168),
            ((datetime.strptime('03.09.2018', '%d.%m.%Y'), datetime.strptime('30.06.2019', '%d.%m.%Y')), 0.24),
            ((datetime.strptime('30.06.2019', '%d.%m.%Y'), datetime.strptime('01.10.2019', '%d.%m.%Y')), 0.30),
            ((datetime.strptime('01.10.2019', '%d.%m.%Y'), datetime.strptime('29.12.2019', '%d.%m.%Y')), 0.24),
            ((datetime.strptime('29.12.2019', '%d.%m.%Y'), datetime.strptime('20.07.2022', '%d.%m.%Y')), 0.192),
            ((datetime.strptime('20.07.2022', '%d.%m.%Y'), datetime.strptime('13.11.2023', '%d.%m.%Y')), 0.30),
            ((datetime.strptime('13.11.2023', '%d.%m.%Y'), datetime.strptime('20.05.2024', '%d.%m.%Y')), 0.42),
            ((datetime.strptime('20.05.2024', '%d.%m.%Y'), datetime.max), 0.54)
        ]

def en_yuksek_faiz_hesapla(anapara, baslangic_tarihi, bitis_tarihi, ardisik_tarih):
    faiz_oranlari = faiz_araliklari_olustur(ardisik_tarih)
    return faiz_hesapla(anapara, baslangic_tarihi, bitis_tarihi, faiz_oranlari)

def yasal_faiz_hesapla(anapara, baslangic_tarihi, bitis_tarihi, ardisik_tarih):
    if ardisik_tarih:
        if bitis_tarihi <= datetime.strptime('31.05.2024', '%d.%m.%Y'):
            faiz_orani = 0.09
        elif baslangic_tarihi >= datetime.strptime('01.06.2024', '%d.%m.%Y'):
            faiz_orani = 0.24
        else:
            ara_tarih = datetime.strptime('01.06.2024', '%d.%m.%Y')
            ilk_donem_faiz = faiz_hesapla(anapara, baslangic_tarihi, ara_tarih - timedelta(days=1), [((baslangic_tarihi, ara_tarih - timedelta(days=1)), 0.09)])
            ikinci_donem_faiz = faiz_hesapla(anapara, ara_tarih, bitis_tarihi, [((ara_tarih, bitis_tarihi), 0.24)])
            toplam_faiz = ilk_donem_faiz[0] + ikinci_donem_faiz[0]
            faiz_araliklari = {**ilk_donem_faiz[1], **ikinci_donem_faiz[1]}
            return toplam_faiz, faiz_araliklari
    else:
        if bitis_tarihi <= datetime.strptime('31.05.2024', '%d.%m.%Y'):
            faiz_orani = 0.09
        elif baslangic_tarihi >= datetime.strptime('31.05.2024', '%d.%m.%Y'):
            faiz_orani = 0.24
        else:
            ara_tarih = datetime.strptime('31.05.2024', '%d.%m.%Y')
            ilk_donem_faiz = faiz_hesapla(anapara, baslangic_tarihi, ara_tarih, [((baslangic_tarihi, ara_tarih), 0.09)])
            ikinci_donem_faiz = faiz_hesapla(anapara, ara_tarih, bitis_tarihi, [((ara_tarih, bitis_tarihi), 0.24)])
            toplam_faiz = ilk_donem_faiz[0] + ikinci_donem_faiz[0]
            faiz_araliklari = {**ilk_donem_faiz[1], **ikinci_donem_faiz[1]}
            return toplam_faiz, faiz_araliklari

    return faiz_hesapla(anapara, baslangic_tarihi, bitis_tarihi, [((baslangic_tarihi, bitis_tarihi), faiz_orani)])

def faiz_hesapla(anapara, baslangic_tarihi, bitis_tarihi, faiz_oranlari):
    faiz_araliklari = {}
    toplam_faiz = 0
    for (baslangic, bitis), faiz_orani in faiz_oranlari:
        if baslangic_tarihi <= bitis and bitis_tarihi >= baslangic:
            baslangic_t = max(baslangic_tarihi, baslangic)
            bitis_t = min(bitis_tarihi, bitis)
            gun_farki = (bitis_t - baslangic_t).days
            if gun_farki < 0:
                continue
            faiz_miktari = (anapara * faiz_orani * gun_farki) / 365
            toplam_faiz += faiz_miktari
            faiz_araliklari[(baslangic_t.strftime('%d.%m.%Y'), bitis_t.strftime('%d.%m.%Y'))] = (faiz_orani, round(faiz_miktari, 2))
    return toplam_faiz, faiz_araliklari

def temizle_sayi(text):
    """Virgül içeren sayısal değeri noktalı formata çevirir"""
    return text.replace(',', '.')

def temizle_tarih(text):
    """Tarihteki virgülleri noktaya çevirir"""
    return text.replace(',', '.')

def hesapla(faiz_turu):
    try:
        anapara = float(temizle_sayi(anapara_entry.get()))
        baslangic_tarihi = datetime.strptime(temizle_tarih(baslangic_entry.get()), '%d.%m.%Y')
        bitis_tarihi = datetime.strptime(temizle_tarih(bitis_entry.get()), '%d.%m.%Y')
        ardisik_tarih = tarih_var.get()  # True ise ardışık, False ise aynı tarih

        if faiz_turu == "En Yüksek Faiz":
            toplam_faiz, faiz_araliklari = en_yuksek_faiz_hesapla(anapara, baslangic_tarihi, bitis_tarihi, ardisik_tarih)
        else:
            toplam_faiz, faiz_araliklari = yasal_faiz_hesapla(anapara, baslangic_tarihi, bitis_tarihi, ardisik_tarih)

        # Treeview'i temizle
        for i in tree.get_children():
            tree.delete(i)

        # Faiz hesaplama sonuçlarını Treeview'e ekle
        for aralik, (oran, miktar) in faiz_araliklari.items():
            tree.insert("", "end", values=(aralik[0], aralik[1], oran, miktar))

        # Toplam faiz miktarını tabloya ekle
        tree.insert("", "end", values=("", "Toplam Faiz", "", round(toplam_faiz, 2)))

    except ValueError as ve:
        messagebox.showerror("Hata", f"Geçersiz giriş: {str(ve)}")
    except Exception as e:
        messagebox.showerror("Hata", f"Bir hata oluştu: {str(e)}")

# Excel olarak kaydetme fonksiyonu
def save_as_excel():
    try:
        dosya_adi = asksaveasfilename(defaultextension=".xlsx", filetypes=[("Excel files", "*.xlsx"), ("All files", "*.*")])
        if dosya_adi:
            wb = Workbook()
            ws = wb.active
            
            # Başlık satırı
            ws.append(["Taşınmaz Bilgileri"])
            ws.append(["İl", "İlçe", "Köy/Mah", "Ada", "Parsel"])
            ws.append([il_entry.get(), ilce_entry.get(), koy_mah_entry.get(), ada_entry.get(), parsel_entry.get()])
            
            # Boş satır
            ws.append([])
            
            # Anapara bilgisi
            ws.append(["Anapara"])
            try:
                anapara = float(temizle_sayi(anapara_entry.get()))
                ws.append([f"{anapara:,.2f} TL"])
            except ValueError:
                ws.append(["Geçersiz Anapara"])
            
            # Boş satır
            # ws.append([])
            
            # Tarih bilgileri
            # baslangic_tarihi = datetime.strptime(temizle_tarih(baslangic_entry.get()), '%d.%m.%Y')
            # bitis_tarihi = datetime.strptime(temizle_tarih(bitis_entry.get()), '%d.%m.%Y')
            # ws.append(["Tarih Aralığı"])
            # ws.append([f"Başlangıç: {baslangic_tarihi}", f"Bitiş: {bitis_tarihi}"])
            
            # Boş satır
            ws.append([])

            # Faiz hesaplama sonuçları
            ws.append(["Faiz Hesaplama Sonuçları"])
            ws.append(["Başlangıç Tarihi", "Bitiş Tarihi", "Faiz Oranı", "Faiz Miktarı"])
            for row_id in tree.get_children():
                row = tree.item(row_id)['values']
                ws.append(row)

            # Boş satır
            ws.append([])
            
            # Karar Bilgisi
            ws.append(["Karar Bilgisi"])
            ws.append([karar_entry.get()])

            # Sütun genişliklerini ayarla
            for column in ws.columns:
                max_length = 0
                column = list(column)
                for cell in column:
                    try:
                        if len(str(cell.value)) > max_length:
                            max_length = len(str(cell.value))
                    except:
                        pass
                adjusted_width = (max_length + 2)
                ws.column_dimensions[column[0].column_letter].width = adjusted_width

            wb.save(dosya_adi)
            messagebox.showinfo("Başarılı", f"Excel dosyası '{dosya_adi}' olarak kaydedildi.")
            # Excel dosyasını otomatik aç
            os.startfile(dosya_adi)
        else:
            messagebox.showwarning("İptal", "Dosya kaydedilmedi.")
    except Exception as e:
        messagebox.showerror("Hata", f"Bir hata oluştu: {str(e)}")

# Hakkında fonksiyonu
def hakkinda():
    webbrowser.open("https://ettunc.com")

# Tkinter arayüzü oluşturma
root = tk.Tk()
root.title("Faiz Hesaplama v6")
root.resizable(False, False)

# Tarih seçeneği için değişken
tarih_var = tk.BooleanVar(value=True)

# Giriş alanları
tk.Label(root, text="Anapara:").grid(row=0, column=0)
tk.Label(root, text="Başlangıç Tarihi (GG.AA.YYYY):").grid(row=1, column=0)
tk.Label(root, text="Bitiş Tarihi (GG.AA.YYYY):").grid(row=2, column=0)
tk.Label(root, text="İl:").grid(row=3, column=0)
tk.Label(root, text="İlçe:").grid(row=4, column=0)
tk.Label(root, text="Köy/Mah:").grid(row=5, column=0)
tk.Label(root, text="Ada:").grid(row=6, column=0)
tk.Label(root, text="Parsel:").grid(row=7, column=0)
tk.Label(root, text="Karar Bilgisi:").grid(row=8, column=0)

# Tarih seçeneği için Radiobutton'lar
tk.Label(root, text="Tarih Hesaplama Yöntemi:").grid(row=9, column=0)
tk.Radiobutton(root, text="Ardışık Tarih", variable=tarih_var, value=True).grid(row=9, column=1, sticky="w")
tk.Radiobutton(root, text="Aynı Tarih", variable=tarih_var, value=False).grid(row=9, column=1, sticky="e")

# Giriş kutuları
anapara_entry = tk.Entry(root)
baslangic_entry = tk.Entry(root)
bitis_entry = tk.Entry(root)
il_entry = tk.Entry(root)
ilce_entry = tk.Entry(root)
koy_mah_entry = tk.Entry(root)
ada_entry = tk.Entry(root)
parsel_entry = tk.Entry(root)
karar_entry = tk.Entry(root)

anapara_entry.grid(row=0, column=1)
baslangic_entry.grid(row=1, column=1)
bitis_entry.grid(row=2, column=1)
il_entry.grid(row=3, column=1)
ilce_entry.grid(row=4, column=1)
koy_mah_entry.grid(row=5, column=1)
ada_entry.grid(row=6, column=1)
parsel_entry.grid(row=7, column=1)
karar_entry.grid(row=8, column=1)

# Treeview
tree = ttk.Treeview(root, columns=("Başlangıç Tarihi", "Bitiş Tarihi", "Faiz Oranı", "Faiz Miktarı"), show="headings")
tree.heading("Başlangıç Tarihi", text="Başlangıç Tarihi")
tree.heading("Bitiş Tarihi", text="Bitiş Tarihi")
tree.heading("Faiz Oranı", text="Faiz Oranı")
tree.heading("Faiz Miktarı", text="Faiz Miktarı")
tree.grid(row=11, column=0, columnspan=2, pady=10)

# Hesapla düğmeleri
tk.Button(root, text="En Yüksek Faiz Hesapla", command=lambda: hesapla("En Yüksek Faiz")).grid(row=10, column=0)
tk.Button(root, text="Yasal Faiz Hesapla", command=lambda: hesapla("Yasal Faiz")).grid(row=10, column=1)

# Kaydetme düğmeleri
tk.Button(root, text="Excel Olarak Kaydet", command=save_as_excel).grid(row=12, column=0, pady=5)
tk.Button(root, text="Hakkında", command=hakkinda).grid(row=12, column=1, pady=5)

root.mainloop()
