import tkinter as tk
from tkinter import ttk, messagebox

class LoanCalculator:
    def __init__(self, root):
        self.root = root
        self.root.title("Кредитный калькулятор")
        self.root.geometry("700x600")
        self.root.resizable(True, True)

        self.amount_var = tk.StringVar()
        self.rate_var = tk.StringVar()
        self.months_var = tk.StringVar()

        self.create_widgets()

    def create_widgets(self):
        main_frame = ttk.Frame(self.root, padding="10")
        main_frame.pack(fill=tk.BOTH, expand=True)

        input_frame = ttk.LabelFrame(main_frame, text="Параметры кредита", padding="10")
        input_frame.pack(fill=tk.X, pady=(0, 10))

        ttk.Label(input_frame, text="Сумма кредита, ₽").grid(row=0, column=0, sticky=tk.W, padx=5, pady=5)
        ttk.Entry(input_frame, textvariable=self.amount_var, width=20).grid(row=0, column=1, sticky=tk.W, padx=5, pady=5)

        ttk.Label(input_frame, text="Ставка, % годовых").grid(row=1, column=0, sticky=tk.W, padx=5, pady=5)
        ttk.Entry(input_frame, textvariable=self.rate_var, width=20).grid(row=1, column=1, sticky=tk.W, padx=5, pady=5)

        ttk.Label(input_frame, text="Срок, месяцев").grid(row=2, column=0, sticky=tk.W, padx=5, pady=5)
        ttk.Entry(input_frame, textvariable=self.months_var, width=20).grid(row=2, column=1, sticky=tk.W, padx=5, pady=5)

        calc_button = ttk.Button(input_frame, text="Рассчитать", command=self.calculate)
        calc_button.grid(row=3, column=0, columnspan=2, pady=10)

        self.result_frame = ttk.LabelFrame(main_frame, text="Результаты", padding="10")
        self.result_frame.pack(fill=tk.X, pady=(0, 10))

        self.payment_label = ttk.Label(self.result_frame, text="Ежемесячный платёж: -")
        self.payment_label.pack(anchor=tk.W, pady=2)
        self.total_label = ttk.Label(self.result_frame, text="Общая сумма выплат: -")
        self.total_label.pack(anchor=tk.W, pady=2)
        self.overpayment_label = ttk.Label(self.result_frame, text="Переплата: -")
        self.overpayment_label.pack(anchor=tk.W, pady=2)

        table_frame = ttk.LabelFrame(main_frame, text="График платежей", padding="10")
        table_frame.pack(fill=tk.BOTH, expand=True)

        columns = ("month", "payment", "principal", "interest", "balance")
        self.tree = ttk.Treeview(table_frame, columns=columns, show="headings", height=15)
        self.tree.heading("month", text="№ месяца")
        self.tree.heading("payment", text="Платёж")
        self.tree.heading("principal", text="Основной долг")
        self.tree.heading("interest", text="Проценты")
        self.tree.heading("balance", text="Остаток долга")

        self.tree.column("month", width=80, anchor=tk.CENTER)
        self.tree.column("payment", width=120, anchor=tk.E)
        self.tree.column("principal", width=120, anchor=tk.E)
        self.tree.column("interest", width=120, anchor=tk.E)
        self.tree.column("balance", width=120, anchor=tk.E)

        vsb = ttk.Scrollbar(table_frame, orient="vertical", command=self.tree.yview)
        self.tree.configure(yscrollcommand=vsb.set)

        self.tree.grid(row=0, column=0, sticky=tk.NSEW)
        vsb.grid(row=0, column=1, sticky=tk.NS)

        table_frame.grid_rowconfigure(0, weight=1)
        table_frame.grid_columnconfigure(0, weight=1)

    def format_currency(self, value):
        return f"{value:,.2f}".replace(',', ' ').replace('.', ',')

    def calculate(self):
        amount_str = self.amount_var.get().strip()
        rate_str = self.rate_var.get().strip()
        months_str = self.months_var.get().strip()

        if not amount_str or not rate_str or not months_str:
            messagebox.showerror("Ошибка", "Заполните все поля")
            return

        try:
            amount = float(amount_str)
        except ValueError:
            messagebox.showerror("Ошибка", "Сумма кредита должна быть числом")
            return

        try:
            rate = float(rate_str)
        except ValueError:
            messagebox.showerror("Ошибка", "Ставка должна быть числом")
            return

        try:
            months = int(months_str)
        except ValueError:
            messagebox.showerror("Ошибка", "Срок должен быть целым числом месяцев")
            return

        if amount <= 0:
            messagebox.showerror("Ошибка", "Сумма кредита должна быть больше нуля")
            return
        if rate < 0:
            messagebox.showerror("Ошибка", "Ставка не может быть отрицательной")
            return
        if months <= 0:
            messagebox.showerror("Ошибка", "Срок должен быть больше нуля")
            return

        if rate == 0:
            monthly_payment = amount / months
            r = 0
        else:
            r = rate / 12 / 100
            factor = (1 + r) ** months
            monthly_payment = amount * r * factor / (factor - 1)

        total_payment = monthly_payment * months
        overpayment = total_payment - amount

        self.payment_label.config(text=f"Ежемесячный платёж: {self.format_currency(monthly_payment)} ₽")
        self.total_label.config(text=f"Общая сумма выплат: {self.format_currency(total_payment)} ₽")
        self.overpayment_label.config(text=f"Переплата: {self.format_currency(overpayment)} ₽")

        self.populate_schedule(amount, monthly_payment, r, months)

    def populate_schedule(self, amount, monthly_payment, r, months):
        for item in self.tree.get_children():
            self.tree.delete(item)

        balance = amount
        for i in range(1, months + 1):
            interest = balance * r
            principal = monthly_payment - interest
            balance -= principal

            self.tree.insert("", tk.END, values=(
                i,
                self.format_currency(monthly_payment),
                self.format_currency(principal),
                self.format_currency(interest),
                self.format_currency(max(balance, 0))
            ))

if __name__ == "__main__":
    root = tk.Tk()
    app = LoanCalculator(root)
    root.mainloop()