#app.py
import json
import gradio as gr
from context.db_loader import SQLiteContextLoader
from models.gpt4o import ModelClient


class NeuroRavenApp:
    def __init__(self):
        self.system_prompt = None
        self.current_theme = None
        self.client = ModelClient()
        self.context_loader = SQLiteContextLoader()

        self.conversation_themes = self.get_conversation_themes()
        if "Без контекста" not in self.conversation_themes:
            self.conversation_themes.append("Без контекста")

    @staticmethod
    def get_conversation_themes(json_path='conversation_themes.json'):
        try:
            with open(json_path, 'r', encoding='utf-8') as file:
                themes = json.load(file)
                if isinstance(themes, list):
                    return themes
                else:
                    print("Файл JSON не содержит списка.")
                    return []
        except (FileNotFoundError, json.JSONDecodeError) as e:
            print(f"Ошибка при загрузке тем беседы из {json_path}: {e}")
            return []

    def handle_query(self, message, history, context_theme, should_save):

        # Сохранение сообщения в базу данных, если чекбокс активирован
        if should_save and isinstance(self.context_loader, SQLiteContextLoader):
            if context_theme == "Без контекста":
                return "Невозможно сохранить сообщение для текущей темы..."

            self.context_loader.save_message(context_theme, message)
            self.current_theme = None
            return "Сообщение сохранено в контекст!"

        if context_theme != self.current_theme:
            context = self.context_loader.load_context(context_theme)
            if context:
                self.system_prompt = f"Отвечай на вопросы беря информацию из контекста: \n{context}"
            else:
                self.system_prompt = "You are a helpful assistant."

            self.current_theme = context_theme

        response = self.client.get_response(
            message=message,
            history=history,
            sys_prompt=self.system_prompt
        )

        return response

    def launch_app(self):
        gr.ChatInterface(
            self.handle_query,
            chatbot=gr.Chatbot(height=500),
            textbox=gr.Textbox(placeholder="Напиши свой вопрос", container=False, scale=7),
            title="NeuroRaven",
            theme="soft",
            retry_btn=None,
            clear_btn="Clear",
            additional_inputs=[
                gr.Dropdown(self.conversation_themes, label="Выбери тему контекста", value="Без контекста"),
                gr.Checkbox(label="Сохранить сообщение", value=False)
            ],
            css="footer{display:none !important}"
        ).launch(server_name="192.168.0.105", server_port=7846)


if __name__ == "__main__":
    app = NeuroRavenApp()
    app.launch_app()

#db_loader.py
import sqlite3
from context.base_loader import ContextLoader


class SQLiteContextLoader(ContextLoader):
    def __init__(self, db_path="context.db"):
        self.db_path = db_path
        self._initialize_database()

    def _initialize_database(self):
        """Создает таблицу в базе данных, если она не существует"""
        conn = sqlite3.connect(self.db_path)
        cursor = conn.cursor()
        # Создаем таблицу contexts, если она еще не существует
        cursor.execute('''
            CREATE TABLE IF NOT EXISTS contexts (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                theme TEXT NOT NULL,
                date_added DATE DEFAULT (date('now')),
                text TEXT NOT NULL
            )
        ''')
        conn.commit()
        conn.close()

    def load_context(self, context_theme):
        if context_theme == "Без контекста":
            return ""

        conn = sqlite3.connect(self.db_path)
        cursor = conn.cursor()

        query = "SELECT text FROM contexts WHERE theme = ?"
        cursor.execute(query, (context_theme,))
        rows = cursor.fetchall()

        all_text = "\n".join(row[0] for row in rows)
        conn.close()

        return all_text

    def save_message(self, context_theme, message):
        conn = sqlite3.connect(self.db_path)
        cursor = conn.cursor()

        query = "INSERT INTO contexts (theme, text) VALUES (?, ?)"
        cursor.execute(query, (context_theme, message))
        conn.commit()
        conn.close()

Вынеси пожалуйста все что нужно в константы и хэлпер