from PySide6.QtWidgets import QStackedWidget
from PySide6.QtCore import Signal

from app.ui.views.login_view import LoginView
from app.ui.views.yobble_home_view import YobbleHomeView
from typing import Optional
from threading import Thread
import time
import asyncio
from app.core.database import get_last_login, get_session, set_last_login
# Импортируем сервис чатов
from app.core.services.chat_service import get_private_chats

class MainController(QStackedWidget):
    # Сигнал для показа уведомлений из любого потока
    #      (message, is_error)
    notification_requested = Signal(str, bool)
    # Сигнал для передачи загруженных данных чата в основной поток
    chats_loaded = Signal(object)

    def __init__(self):
        super().__init__()
        self.login_view: Optional[LoginView] = None
        self.yobble_home_view: Optional[YobbleHomeView] = None

        self.init_app()

    def init_app(self):
        """Проверяет наличие сессии для автологина."""
        last_login = get_last_login()
        if last_login:
            session = get_session(last_login)
            if session:
                self.handle_login_success(last_login)
                return

        self.show_login()

    def show_login(self):
        self.login_view = LoginView(on_login=self.handle_login_success)
        self.addWidget(self.login_view)
        self.setCurrentWidget(self.login_view)
        self.login_view.show()

    def handle_login_success(self, username: str):
        """Обрабатывает успешный вход в систему."""
        set_last_login(username)
        session = get_session(username)
        user_id = session["user_id"] if session else None

        if not user_id:
            self.show_login()
            self.notification_requested.emit("Не удалось получить ID пользователя из сессии.", True)
            return

        if self.login_view:
            self.login_view.close()
            self.removeWidget(self.login_view)
            self.login_view = None

        self.yobble_home_view = YobbleHomeView(username=username, current_user_id=user_id)
        
        # Подключаем сигналы к слотам в YobbleHomeView
        self.notification_requested.connect(self.yobble_home_view.show_notification)
        self.chats_loaded.connect(self.yobble_home_view.update_chat_list)
        
        self.addWidget(self.yobble_home_view)
        self.setCurrentWidget(self.yobble_home_view)
        self.yobble_home_view.show()

        Thread(target=self.update_data_from_server, args=(username,), daemon=True).start()

    def update_data_from_server(self, username: str):
        """
        В фоновом режиме обновляет данные с сервера.
        """
        #time.sleep(2)
        print(f"[Sync] Обновляем данные для пользователя: {username}")

        if self.yobble_home_view:
            print("[Sync] Запускаем предзагрузку прав доступа...")
            try:
                # `preload_permissions` теперь возвращает кортеж (успех, данные)
                # asyncio.run() выполняет async функцию и возвращает её результат
                asyncio.run(self.yobble_home_view.preload_permissions())

                # Загружаем список чатов
                print("[Sync] Загружаем список чатов...")
                asyncio.run(self.load_chats(username))

            except Exception as e:
                error_message = f"Ошибка предзагрузки: {e}"
                print(f"[Sync] {error_message}")
                # Отправляем сигнал вместо прямого вызова
                self.notification_requested.emit(error_message, True)

    async def load_chats(self, username: str):
        """
        Загружает список чатов для пользователя.
        """
        session = get_session(username)
        # print("debug session", session)
        # if not session or 'access_token' not in session:
        #     self.notification_requested.emit("Сессия не найдена, не могу загрузить чаты.", True)
        #     return

        token = session['access_token']
        success, data = await get_private_chats(login=username, token=token, offset=0, limit=50)

        if success:
            # Отправляем данные в основной поток через сигнал
            self.chats_loaded.emit(data)
        else:
            # Отправляем ошибку в основной поток через сигнал
            self.notification_requested.emit(f"Не удалось загрузить чаты: {data}", True)
            print("data", data)

