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


# -*- coding: utf-8 -*-
"""
Рабочий контроллер для создания проектов.
"""
import os
import sqlite3
from pathlib import Path
from modules.data.project_database import ProjectDatabase
from modules.data.database_module import get_db_connection


class ProjectCreateController:
    DB_DIRECTORY = "project_dbs"
    
    def __init__(self, manager: ProjectDatabase):
        self.db = db

    def create_project(self, project_data: dict) -> bool:
        human_name = project_data.get("name")
        project_code = project_data.get("code")
        
        db_path = Path(self.DB_DIRECTORY) / f"{project_code}.db"

        try:
            # Проверка существования после паузы
            time.sleep(0.1) # Минимальная задержка
            
            if db_path.exists():
                from tkinter import messagebox
                messagebox.showerror(
                    "Файл уже существует",
                    ("Проект с таким кодом уже создан физически.")
                )
                return False

            # Создаем объект Project
            project = Project(name=human_name)
            project.id = project_code

            # Сохранение через менеджер (создает пустой .db)
            success = self.manager.add_project(project)
            if not success:
                return False

            # Инициализация структуры таблиц внутри новой БД
            conn = sqlite3.connect(db_path)
            cursor = conn.cursor()
            cursor.execute(f"""
                CREATE TABLE IF NOT EXISTS project_data (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    project_code TEXT UNIQUE NOT NULL,
                    created_at TEXT NOT NULL
                )
            """)
            conn.commit()
            conn.close()
            
            print(f"[SUCCESS] Проект '{human_name}' создан.")
            return True

        except Exception as e:
            print(f"[FATAL] Create failed: {e}")
            if db_path.exists():
                try:
                    os.remove(db_path)
                except OSError:
                    pass
            from tkinter import messagebox
            messagebox.showerror("Ошибка", f"Не удалось записать данные:\n{e}")
            return False

    def create_project(self, data: dict) -> bool:
        """
        Создает запись о новом проекте в базе данных.
        Возвращает True при успехе, False при ошибке.
        """
        name = data.get("name")
        code = data.get("code")

        if not name or not code:
            return False

        try:
            # Используем наш менеджер соединений из database_module
            with get_db_connection() as conn:
                cursor = conn.cursor()
                
                # Проверяем, занят ли код проекта (если есть таблица projects)
                # Если таблицы проектов еще нет, ее нужно создать в init_database()
                cursor.execute(
                    "INSERT INTO projects (name, code) VALUES (?, ?)", 
                    (name, code)
                )
                conn.commit()
            
            messagebox.showinfo("Успех", f"Проект '{name}' успешно создан.")
            return True

        except sqlite3.IntegrityError:
            # Ошибка возникает, если UNIQUE-ограничение нарушено (код уже существует)
            messagebox.showerror("Ошибка", f"Проект с кодом '{code}' уже существует!")
            return False
        except Exception as e:
            messagebox.showerror("Критическая ошибка", f"Не удалось сохранить проект: {e}")
            return False