Загрузка данных


# =================================================================
# dukora/modules/project/project_window_2.py (Чистая версия для секции графиков)
# =================================================================
import customtkinter as ctk
import tkinter as tk
from tkinter import ttk
import datetime
import sys
from pathlib import Path

sys.path.append(str(Path(__file__).resolve().parents[3]))

def build_charts_interface(parent_frame, window_context):
    # --- Очистка ---
    for widget in parent_frame.winfo_children():
        widget.destroy()

    # --- Переменные ---
    var_group = ctk.StringVar(value="Все группы")
    var_date_from = ctk.StringVar(value=datetime.datetime.now().strftime('%d.%m.%Y'))
    var_period = ctk.IntVar(value=1)  # Исправлено: По умолчанию 1 день
    var_chart_type = ctk.StringVar(value="Гистограмма")
    
    try:
        from modules.project.project_event_logic import ProjectEventLogic
        logic = ProjectEventLogic(window_context.manager_db)
    except Exception:
        logic = None

    # === Блок 1: Группа + Кнопки ===
    grp_f = ctk.CTkFrame(parent_frame, fg_color="transparent", height=50)
    grp_f.pack(fill="x", pady=(0, 5), padx=5)
    grp_f.grid_columnconfigure(1, weight=1)

    lbl_g = ctk.CTkLabel(grp_f, text="Группа:", anchor="w", width=80)
    lbl_g.pack(side="left", padx=(0, 5))

    cmb_group = ctk.CTkComboBox(
        grp_f, 
        state="readonly", 
        width=200,
        variable=var_group
    )
    cmb_group.pack(side="left", expand=True, fill="x", padx=5)

    btn_add = ctk.CTkButton(grp_f, text="Добавить в список", fg_color="#3B82F6", command=lambda: _add_to_list(listbox_groups_ref, var_group.get(), window_context))
    btn_add.pack(side="right", padx=5)

    # Листбокс групп
    list_frame = ctk.CTkFrame(parent_frame)
    list_frame.pack(fill="both", expand=True, pady=(5, 15), padx=5)
    
    listbox_groups_ref = tk.Listbox(list_frame, height=4, selectmode="browse") 
    listbox_groups_ref.pack(side="left", fill="both", expand=True, padx=(0, 5))
    
    scrollbar = ctk.CTkScrollbar(list_frame, orientation="vertical", command=listbox_groups_ref.yview)
    scrollbar.pack(side="right", fill="y")
    listbox_groups_ref.config(yscrollcommand=scrollbar.set)

    # === Блок 2: Дата ===
    date_f = ctk.CTkFrame(parent_frame, fg_color="transparent", height=40)
    date_f.pack(fill="x", pady=5, padx=5)
    
    lbl_d = ctk.CTkLabel(date_f, text="Дата начала:", anchor="w", width=80)
    lbl_d.pack(side="left", padx=(0, 5))
    
    try:
        from tkcalendar import DateEntry
        de = DateEntry(
            master=date_f, width=12,
            background='darkblue', foreground='white', bordercolor='gray',
            headersbackground='darkgray', normalbackground='white', normalforeground='black',
            weekendbackground='lightblue', weekendforeground='red', date_pattern='dd.MM.yyyy',
            textvariable=var_date_from
        )
        today = datetime.datetime.now()
        de.set_date(today)
        de.pack(side="left", padx=5)
    except ImportError:
        e_entry = ctk.CTkEntry(date_f, placeholder_text="ДД.ММ.ГГГГ", width=120, textvariable=var_date_from)
        e_entry.insert(0, datetime.datetime.now().strftime('%d.%m.%Y'))
        e_entry.pack(side="left", padx=5)

    # === Блок 3: Периодичность ===
    per_f = ctk.CTkFrame(parent_frame, fg_color="transparent", height=40)
    per_f.pack(fill="x", pady=5, padx=5)
    
    lbl_p = ctk.CTkLabel(per_f, text="Шаг (дней):", anchor="w", width=80)
    lbl_p.pack(side="left", padx=(0, 10))
    
    ent_p = ctk.CTkEntry(per_f, width=60, justify="center", textvariable=var_period)
    ent_p.pack(side="left", padx=5)
    
    hint = ctk.CTkLabel(per_f, text="(ось X)", text_color="#A9A9A9")
    hint.pack(side="left")

    # === Блок 4: Тип диаграммы ===
    type_f = ctk.CTkFrame(parent_frame, fg_color="transparent", height=40)
    type_f.pack(fill="x", pady=5, padx=5)
    
    lbl_t = ctk.CTkLabel(type_f, text="Тип:", anchor="w", width=80)
    lbl_t.pack(side="left")
    
    ctk.CTkComboBox(type_f, values=["Гистограмма", "График"], state="readonly", width=150, variable=var_chart_type).pack(side="left", padx=5)

    # === НИЖНИЕ КНОПКИ ===
    action_f = ctk.CTkFrame(parent_frame)
    action_f.pack(fill="x", pady=(20, 0), padx=5)
    
    for i in range(2): action_f.grid_columnconfigure(i, weight=1)
    
    def reset_all_filters():
        var_group.set("Все группы")
        window_context.var_date_from.set(datetime.datetime.now().strftime('%d.%m.%Y'))
        var_period.set(1) # Сброс тоже на 1
        window_context.var_chart_type.set("Гистограмма")
        if hasattr(window_context, 'listbox_groups'):
            window_context.listbox_groups.delete(0, tk.END)
            
    def add_current_selection():
        selected = var_group.get()
        if selected and selected != "Все группы":
            current_items = listbox_groups_ref.get(0, tk.END)
            if selected not in current_items:
                listbox_groups_ref.insert(tk.END, selected)
                
    def remove_selected_item():
        sel = listbox_groups_ref.curselection()
        if sel:
            listbox_groups_ref.delete(sel[0])

    btn_reset = ctk.CTkButton(action_f, text="Сбросить настройки", fg_color="#EF4444", command=reset_all_filters)
    btn_reset.pack(side="left", expand=True, fill="x", padx=5)
    
    btn_build = ctk.CTkButton(action_f, text="Построить диаграмму", fg_color="#3B82F6", command=lambda: print("[BUILD] Logic pending..."))
    btn_build.pack(side="right", expand=True, fill="x", padx=5)

    # Сохранение ссылок
    window_context.btn_reset_section = btn_reset
    window_context.btn_build_section = btn_build
    window_context.listbox_groups = listbox_groups_ref
    window_context.var_group = var_group
    window_context.var_date_from = var_date_from
    window_context.var_period_str = var_period
    window_context.var_chart_type = var_chart_type

    # Заполнение комбобокса данными из БД
    if logic:
        groups_raw, _ = logic.load_groups_and_indicators()
        names = []
        if groups_raw:
            try:
                if hasattr(groups_raw[0], 'name'):
                    names = sorted([item.name for item in groups_raw])
                elif isinstance(groups_raw[0], tuple):
                    names = sorted([item[1] for item in groups_raw])
                else:
                    names = sorted(groups_raw)
                items.extend(names)
            except Exception:
                pass
        cmb_group.configure(values=names)
        if names:
            cmb_group.set(names[0])

# Вспомогательные функции (_add_to_list логика уже внутри через lambda выше)