import csv
import matplotlib.pyplot as plt
from datetime import datetime
import tkinter as tk
from tkinter import filedialog, ttk, messagebox

# Глобальная переменная для хранения данных
data = []

# Функция для загрузки CSV файла
def load_csv():
    global data
    filepath = filedialog.askopenfilename(filetypes=[("CSV files", "*.csv")])
    if filepath:
        data = []
        try:
            with open(filepath, newline='', encoding='utf-8') as csvfile:
                reader = csv.DictReader(csvfile)
                for row in reader:
                    row['Datums'] = datetime.strptime(row['Datums'], '%Y-%m-%d')
                    row['Ieņēmumi'] = float(row['Ieņēmumi'])
                    row['Izdevumi'] = float(row['Izdevumi'])
                    data.append(row)
            display_data()
        except Exception as e:
            messagebox.showerror("Kļūda", f"Nevar nolasīt failu: {e}")
    else:
        messagebox.showerror("Kļūda", "Netika izvēlēts fails.")

# Функция для отображения данных в таблице и обновления выпадающего списка
def display_data():
    # Очистка таблицы и выпадающего списка
    for row in table.get_children():
        table.delete(row)
    categories = set()
    
    # Добавление данных в таблицу
    for row in data:
        table.insert("", "end", values=(row["Datums"].strftime('%Y-%m-%d'), row["Kategorija"], row["Ieņēmumi"], row["Izdevumi"], row["Komentārs"]))
        categories.add(row["Kategorija"])

    # Обновление выпадающего списка категорий
    category_combo["values"] = list(categories)
    if categories:
        category_combo.current(0)

# Функция для анализа данных по выбранной категории
def analyze_data():
    selected_category = category_combo.get()
    category_data = [row for row in data if row["Kategorija"] == selected_category]

    if not category_data:
        messagebox.showinfo("Rezultāti", "Nav datu šai kategorijai.")
        return
    
    # Анализ данных
    avg_income = sum(row["Ieņēmumi"] for row in category_data) / len(category_data)
    avg_expense = sum(row["Izdevumi"] for row in category_data) / len(category_data)
    max_income = max(row["Ieņēmumi"] for row in category_data)
    min_income = min(row["Ieņēmumi"] for row in category_data)
    max_expense = max(row["Izdevumi"] for row in category_data)
    min_expense = min(row["Izdevumi"] for row in category_data)
    total_income = sum(row["Ieņēmumi"] for row in category_data)
    total_expense = sum(row["Izdevumi"] for row in category_data)
    
    # Отображение результатов
    analysis_result = (
        f"Vidējie ieņēmumi: {avg_income:.2f}\n"
        f"Vidējie izdevumi: {avg_expense:.2f}\n"
        f"Maksimālie ieņēmumi: {max_income}\n"
        f"Minimālie ieņēmumi: {min_income}\n"
        f"Maksimālie izdevumi: {max_expense}\n"
        f"Minimālie izdevumi: {min_expense}\n"
        f"Kopējie ieņēmumi: {total_income}\n"
        f"Kopējie izdevumi: {total_expense}"
    )
    messagebox.showinfo("Analīzes rezultāti", analysis_result)

# Функция для построения графика по выбранной категории
def plot_data():
    selected_category = category_combo.get()
    category_data = [row for row in data if row["Kategorija"] == selected_category]
    
    if not category_data:
        messagebox.showinfo("Grafiks", "Nav datu šai kategorijai.")
        return

    # Группировка данных по годам
    yearly_data = {}
    for row in category_data:
        year = row["Datums"].year
        if year not in yearly_data:
            yearly_data[year] = {"Ieņēmumi": 0, "Izdevumi": 0}
        yearly_data[year]["Ieņēmumi"] += row["Ieņēmumi"]
        yearly_data[year]["Izdevumi"] += row["Izdevumi"]

    # Подготовка данных для графика
    years = sorted(yearly_data.keys())
    income = [yearly_data[year]["Ieņēmumi"] for year in years]
    expense = [yearly_data[year]["Izdevumi"] for year in years]

    # Построение графика
    plt.figure(figsize=(10, 6))
    plt.plot(years, income, label="Ieņēmumi", color="green", marker="o")
    plt.plot(years, expense, label="Izdevumi", color="red", marker="o")
    plt.title(f"{selected_category} - Ieņēmumi un izdevumi pa gadiem")
    plt.xlabel("Gads")
    plt.ylabel("Summa")
    plt.legend()
    plt.grid(True)
    plt.show()

# Создание интерфейса
root = tk.Tk()
root.title("Finanšu datu analīze pēc kategorijām")

# Таблица для отображения данных
table = ttk.Treeview(root, columns=("Datums", "Kategorija", "Ieņēmumi", "Izdevumi", "Komentārs"), show="headings")
table.heading("Datums", text="Datums")
table.heading("Kategorija", text="Kategorija")
table.heading("Ieņēmumi", text="Ieņēmumi")
table.heading("Izdevumi", text="Izdevumi")
table.heading("Komentārs", text="Komentārs")
table.pack()

# Кнопка для загрузки файла
load_button = tk.Button(root, text="Ielādēt failu", command=load_csv)
load_button.pack()

# Метка и выпадающий список для выбора категории
category_label = tk.Label(root, text="Izvēlieties kategoriju:")
category_label.pack()

category_combo = ttk.Combobox(root)
category_combo.pack()

# Кнопка для анализа данных
analyze_button = tk.Button(root, text="Analizēt", command=analyze_data)
analyze_button.pack()

# Кнопка для построения графика
plot_button = tk.Button(root, text="Zīmēt grafiku", command=plot_data)
plot_button.pack()

# Запуск главного цикла
root.mainloop()