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


# -*- coding: utf-8 -*-
"""
Авторизация vFinal. С силовым выводом окна.
"""
import tkinter as tk
from tkinter import ttk
import ctypes
import sqlite3

class AuthInterface(tk.Toplevel):
    def __init__(self, master, on_login_click=None):
        super().__init__(master)
        
        self.on_login_command = on_login_click
        
        # --- БАЗОВЫЕ ПАРАМЕТРЫ ---
        self.title("Авторизация")
        self.resizable(False, False)
        
        # Принудительно задаем размер ДО любых сеток
        win_w, win_h = 300, 150
        self.geometry(f"{win_w}x{win_h}")
        
        # --- ЖЕСТКОЕ ПОЗИЦИОНИРОВАНИЕ ЧЕРЕЗ WINAPI ---
        user32 = ctypes.windll.user32
        screen_w = user32.GetSystemMetrics(0) # SM_CXSCREEN
        screen_h = user32.GetSystemMetrics(1) # SM_CYSCREEN
        
        pos_x = int((screen_w / 2) - (win_w / 2))
        pos_y = int((screen_h / 2) - (win_h / 2))
        
        # Форсируем позицию минуя логику Tkinter
        self.geometry(f"+{pos_x}+{pos_y}")
        
        # Принудительная отрисовка всех запросов ОС прямо сейчас
        self.update_idletasks() 
        
        # --- ИНТЕРФЕЙС ТОЛЬКО ПОСЛЕ ТОГО, КАК ОКНО НАРИСОВАНО ---
        frame = ttk.Frame(self, padding=20)
        frame.pack(fill="both", expand=True)

        ttk.Label(frame, text="Логин:").grid(row=0, column=0, sticky="w")
        self.login_entry = ttk.Entry(frame, width=25)
        self.login_entry.grid(row=0, column=1, pady=5)

        ttk.Label(frame, text="Пароль:").grid(row=1, column=0, sticky="w")
        self.password_entry = ttk.Entry(frame, show="*", width=25)
        self.password_entry.grid(row=1, column=1, pady=5)

        btn_frame = ttk.Frame(frame)
        btn_frame.grid(row=2, column=0, columnspan=2, pady=15)

        login_btn = ttk.Button(btn_frame, text="Войти", command=self._try_login)
        login_btn.pack(side="left", padx=5)

        exit_btn = ttk.Button(btn_frame, text="Выход", command=self.destroy)
        exit_btn.pack(side="left", padx=5)

        self.login_entry.focus()
        
        # --- ЖЕСТКИЙ ЗАХВАТ ФОКУСА И ПОДНЯТИЕ НАД ВСЕМ ---
        self.lift()           # Поднимаем окно выше других
        self.focus_force()    # Принудительно забираем фокус ввода
        self.grab_set()       # Делаем окно модальным (блокируем всё остальное)
        
        # Еще одна принудительная проверка перед захватом фокуса
        self.update_idletasks()



    def _try_login(self):
        username = self.login_entry.get().strip()
        password = self.password_entry.get().strip()
        
        print(f"[AUTH DEBUG] Логин='{username}', Пароль есть: {len(password) > 0}")
        
        if not username or not password:
            from tkinter import messagebox
            messagebox.showwarning("Ошибка", "Поля не могут быть пустыми")
            return

        try:
            from modules.administrator.user_logic import UserLogic
            db_manager = UserLogic()
            
            # Проверяем путь к файлу физически
            import os
            if not os.path.exists(db_manager.db_path):
                raise FileNotFoundError(f"База users.db не найдена! Путь: {db_manager.db_path}")

            success = db_manager.validate_credentials(username, password)
            print(f"[AUTH DEBUG] validate_credentials вернула: {success}")

            if success:
                role = None
                with sqlite3.connect(db_manager.db_path) as conn:
                    row = conn.execute("SELECT role FROM users WHERE login=?", (username,)).fetchone()
                    if row:
                        role = row[0]
                
                print(f"[AUTH DEBUG] Роль извлечена: '{role}'")
                
                if callable(self.on_login_command):
                    # Вызываем колбэк главного окна
                    self.on_login_command(username, role)
                    print("[AUTH DEBUG] Колбэк выполнен, закрываем окно.")
                    self.destroy()
                else:
                    print("[FATAL ERROR] on_login_command is not callable!")
            else:
                from tkinter import messagebox
                messagebox.showerror("Ошибка", "Неверный логин или пароль")
                self.password_entry.delete(0, tk.END)
                self.password_entry.focus()
                
        except Exception as e:
            from tkinter import messagebox
            messagebox.showerror("Критическая ошибка", str(e))
            print(f"[FATAL LOGIN ERROR]: {e}")