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


# -*- coding: utf-8 -*-
# project_create.py

import datetime
import os
import tkinter as tk
from tkinter import Toplevel, messagebox, ttk

from gui.project_manager import Project, ProjectManager
from modules.project_database import ProjectDatabase


class CreateProjectWindow:
    """
    Диалоговое окно для создания нового проекта.
    """

    MIN_CODE_LENGTH = 3
    MAX_NAME_LENGTH = 100

    def __init__(self, manager: ProjectManager):
        """
        :param manager: Экземпляр ProjectManager для добавления проекта.
        """
        self.manager = manager
        self.window = Toplevel()
        self.window.title("Создание нового проекта")
        self.window.geometry("450x300")
        self.window.resizable(False, False)

        # Главный фрейм с сеткой для аккуратного размещения
        main_frame = ttk.Frame(self.window, padding="10")
        main_frame.pack(fill="both", expand=True)
        main_frame.columnconfigure(1, weight=1)  # Второй столбец растягивается

        # --- 1. Поля ввода ---
        ttk.Label(main_frame, text="Название проекта:").grid(
            row=0, column=0, padx=5, pady=5, sticky="e"
        )
        self.name_entry = ttk.Entry(main_frame, width=40)
        self.name_entry.grid(row=0, column=1, padx=5, pady=5, sticky="we")

        ttk.Label(main_frame, text="Код проекта:").grid(
            row=1, column=0, padx=5, pady=5, sticky="e"
        )
        self.code_entry = ttk.Entry(main_frame, width=40)
        self.code_entry.grid(row=1, column=1, padx=5, pady=5, sticky="we")

        ttk.Label(main_frame, text="Описание:").grid(
            row=2, column=0, padx=5, pady=5, sticky="e"
        )
        self.desc_entry = ttk.Entry(main_frame, width=40)
        self.desc_entry.grid(row=2, column=1, padx=5, pady=5, sticky="we")

        ttk.Label(main_frame, text="Дата открытия:").grid(
            row=3, column=0, padx=5, pady=5, sticky="e"
        )
        self.date_entry = ttk.Entry(main_frame, width=15)
        default_date = datetime.datetime.now().strftime("%Y-%m-%d")
        self.date_entry.insert(0, default_date)
        self.date_entry.grid(row=3, column=1, padx=5, pady=5)

        ttk.Label(main_frame, text="Ответственный:").grid(
            row=4, column=0, padx=5, pady=5, sticky="e"
        )
        self.resp_entry = ttk.Entry(main_frame, width=40)
        self.resp_entry.grid(row=4, column=1, padx=5, pady=5, sticky="we")

        # --- 2. Кнопки действий ---
        # Фрейм для выравнивания кнопок справа внизу окна
        button_frame = ttk.Frame(self.window)
        button_frame.pack(pady=(20, 10), fill="x")

        # Кнопка "Отмена"
        ttk.Button(button_frame, text="Отмена", command=self.window.destroy).pack(
            side="right", padx=(0, 10)
        )

        # Кнопка "Создать"
        ttk.Button(button_frame, text="Создать", command=self.create_project).pack(
            side="right"
        )

    def create_project(self):
        """Обрабатывает нажатие кнопки 'Создать'."""
        # Получаем данные из формы
        human_name = self.name_entry.get()  # Название проекта
        project_code = self.code_entry.get()  # Код проекта

        # Проверка на пустые поля
        if not human_name or not project_code:
            messagebox.showerror("Ошибка", "Введите название и код проекта!")
            return

        try:
            # --- 1. Проверка существования базы данных (ПОДАВЛЕНИЕ ВЫВОДА) ---
            # Создаем объект БД внутри блока с перенаправлением stdout,
            # чтобы скрыть служебные сообщения о создании папки и подключении.
            import sys
            import os

            # Сохраняем стандартный вывод
            old_stdout = sys.stdout

            # Перенаправляем вывод в "пустоту"
            sys.stdout = open(os.devnull, "w")

            # Создаем объект и сразу пытаемся подключиться.
            # Все print() внутри ProjectDatabase.__init__ и .connect() будут скрыты.
            project_db = ProjectDatabase(project_code)
            is_db_new = not os.path.exists(project_db.db_path)  # Флаг: новая ли это БД?
            conn = project_db.connect()

            # Возвращаем стандартный вывод
            sys.stdout = old_stdout

            # Если база уже существует, показываем ошибку
            if not is_db_new:
                project_db.close()  # Закрываем соединение перед возвратом
                messagebox.showerror(
                    "Ошибка", f"База данных для кода '{project_code}' уже существует!"
                )
                return

            # --- 2. Создание объекта Project и заполнение данных ---
            project = Project(name=human_name)
            project.id = project_code  # Задаем ID (код проекта)

            # Заполняем остальные поля из формы
            project.description = self.desc_entry.get()
            project.responsible = self.resp_entry.get()
            project.date_opened = self.date_entry.get()

            # --- 3. Сохранение проекта через менеджер ---
            success = self.manager.add_project(project)

            if success:
                messagebox.showinfo("Успех", f"Проект '{human_name}' успешно создан!")
                # Создаем таблицы в новой базе данных, если проект был добавлен
                project_db.create_tables()
            else:
                messagebox.showerror("Ошибка", "Не удалось создать проект.")

        except Exception as e:
            messagebox.showerror(
                "Критическая ошибка", f"Не удалось создать проект:\n{str(e)}"
            )
        finally:
            self.window.destroy()