import sys
import sqlite3
import random

from PyQt6.QtWidgets import (
    QApplication, QWidget, QLabel, QPushButton,
    QVBoxLayout, QHBoxLayout, QMessageBox,
    QLineEdit, QSizePolicy, QScrollArea
)
from PyQt6.QtCore import Qt, pyqtSignal

# Подключение к базе данных
try:
    conn = sqlite3.connect('justproject')
    cur = conn.cursor()
except sqlite3.Error as e:
    print(f"Не удалось подключиться к базе данных: {e}")
    sys.exit(1)


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Тестирование по русскому языку (ЕГЭ)")
        self.resize(400, 200)
        self.setStyleSheet("background-color: #f0f0f0; font-family: 'Arial';")

        button_udarenie = QPushButton("Ударение (№4 ЕГЭ)")
        button_udarenie.clicked.connect(self.open_udarenie_window)
        button_udarenie.setStyleSheet(self.button_style())

        button_poliformizmy = QPushButton("Полиморфизмы (№5 ЕГЭ)")
        button_poliformizmy.clicked.connect(self.open_poliformizmy_window)
        button_poliformizmy.setStyleSheet(self.button_style())

        # Размещение кнопок горизонтально
        hbox = QHBoxLayout()
        hbox.addWidget(button_udarenie)
        hbox.addWidget(button_poliformizmy)

        # Размещение элементов вертикально
        vbox = QVBoxLayout()
        vbox.addLayout(hbox)
        self.setLayout(vbox)

    def button_style(self):
        return "QPushButton {" \
               "background-color: #4285f4; color: white; padding: 10px; border-radius: 5px;" \
               "}" \
               "QPushButton:hover {" \
               "background-color: #357ae8;" \
               "}"

    def open_udarenie_window(self):
        self.udarenie_window = UdarenieWindow(cur)
        self.udarenie_window.show()

    def open_poliformizmy_window(self):
        self.poliformizmy_window = PoliformizmyWindow(cur)
        self.poliformizmy_window.show()


class UdarenieWindow(QWidget):
    def __init__(self, cursor):
        super().__init__()
        self.setWindowTitle("Результаты: Ударение")
        self.resize(400, 200)
        self.setStyleSheet("background-color: #f0f0f0; font-family: 'Arial';")

        self.result_label = QLabel("Твой результат: [процент правильных ответов]")
        self.result_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.result_label.setStyleSheet("padding: 10px; font-size: 18px;")

        start_test_button = QPushButton("Начать тест")
        start_test_button.clicked.connect(self.open_udarenie2_window)
        start_test_button.setStyleSheet(self.button_style())

        vbox = QVBoxLayout()
        vbox.addWidget(self.result_label)
        vbox.addWidget(start_test_button)
        self.setLayout(vbox)

        self.cursor = cursor

    def button_style(self):
        return "QPushButton {" \
               "background-color: #4285f4; color: white; padding: 10px; border-radius: 5px;" \
               "}" \
               "QPushButton:hover {" \
               "background-color: #357ae8;" \
               "}"

    def open_udarenie2_window(self):
        self.udarenie2_window = Udarenie2Window(self.cursor)
        self.udarenie2_window.test_finished.connect(self.display_result)
        self.udarenie2_window.show()

    def display_result(self, percentage):
        self.result_label.setText(f"Твой результат: {percentage:.2f}% правильных ответов")


class PoliformizmyWindow(QWidget):
    def __init__(self, cursor):
        super().__init__()
        self.setWindowTitle("Результаты: Полиморфизмы")
        self.resize(400, 200)
        self.setStyleSheet("background-color: #f0f0f0; font-family: 'Arial';")

        self.result_label = QLabel("Твой результат: [процент правильных ответов]")
        self.result_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.result_label.setStyleSheet("padding: 10px; font-size: 18px;")

        start_test_button = QPushButton("Начать тест")
        start_test_button.clicked.connect(lambda: self.open_poliformizmy2_window(cursor))
        start_test_button.setStyleSheet(self.button_style())

        vbox = QVBoxLayout()
        vbox.addWidget(self.result_label)
        vbox.addWidget(start_test_button)
        self.setLayout(vbox)

        self.cursor = cursor

    def button_style(self):
        return "QPushButton {" \
               "background-color: #4285f4; color: white; padding: 10px; border-radius: 5px;" \
               "}" \
               "QPushButton:hover {" \
               "background-color: #357ae8;" \
               "}"

    def open_poliformizmy2_window(self, cursor):
        self.poliformizmy2_window = Poliformizmy2Window(cursor)
        self.poliformizmy2_window.test_finished.connect(self.display_result)
        self.poliformizmy2_window.show()

    def display_result(self, percentage):
        self.result_label.setText(f"Твой результат: {percentage:.2f}% правильных ответов")


class Udarenie2Window(QWidget):
    test_finished = pyqtSignal(float)

    def __init__(self, cursor):
        super().__init__()
        self.setWindowTitle("Тест по Ударению")
        self.resize(600, 400)
        self.setStyleSheet("background-color: #f0f0f0; font-family: 'Arial';")

        self.cur = cursor  # Передаём курсор базы данных в класс

        # Загрузка данных из базы данных
        self.load_data()

        # Инициализация текущего состояния
        self.current_word = 0
        self.correct_count = 0
        self.total_words = len(self.test_data)

        # Перемешивание слов для рандомизации порядка
        combined = list(zip(self.test_data, self.correct_answers))
        random.shuffle(combined)
        if combined:
            shuffled_test_data, shuffled_correct_answers = zip(*combined)
            self.test_data = list(shuffled_test_data)
            self.correct_answers = list(shuffled_correct_answers)
        else:
            self.test_data = []
            self.correct_answers = []

        # Инициализация и настройка виджетов
        self.init_ui()

        # Первоначальное отображение первого слова и кнопок
        self.update_word_label()
        self.create_letter_buttons()

    def load_data(self):
        try:
            data = self.cur.execute("SELECT word, index_letter FROM Udarenie").fetchall()
            self.test_data = [list(row[0]) for row in data]
            self.correct_answers = [row[1] for row in data]
        except sqlite3.Error as e:
            QMessageBox.critical(self, "Ошибка базы данных", f"Не удалось загрузить данные:\n{e}")
            sys.exit(1)

        if not self.test_data:
            QMessageBox.information(self, "Нет данных", "В базе данных отсутствуют слова для тестирования.")
            sys.exit(0)

    def init_ui(self):
        self.word_label = QLabel()
        self.word_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.word_label.setStyleSheet("font-size: 24px; font-weight: bold;")

        self.view_results_button = QPushButton("Посмотреть текущий результат")
        self.view_results_button.clicked.connect(self.view_results)
        self.view_results_button.setStyleSheet(self.button_style())

        self.exit_button = QPushButton("Выйти из теста")
        self.exit_button.clicked.connect(self.exit_test)
        self.exit_button.setStyleSheet("background-color: red; color: white; padding: 10px; border-radius: 5px;")

        # Создание прокручиваемой области для кнопок букв
        self.scroll_area = QScrollArea()
        self.scroll_area.setWidgetResizable(True)
        self.scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAsNeeded)
        self.scroll_area.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
        self.scroll_area.setFixedHeight(80)  # Установка фиксированной высоты прокручиваемой области

        # Внутренний виджет и горизонтальный макет для кнопок
        self.buttons_widget = QWidget()
        self.buttons_layout = QHBoxLayout()
        self.buttons_layout.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.buttons_widget.setLayout(self.buttons_layout)

        self.scroll_area.setWidget(self.buttons_widget)

        # Основной вертикальный макет
        main_layout = QVBoxLayout()
        main_layout.addWidget(self.word_label)
        main_layout.addWidget(self.scroll_area)  # Добавляем прокручиваемую область с кнопками
        main_layout.addWidget(self.view_results_button,
                              alignment=Qt.AlignmentFlag.AlignCenter)  # Добавляем кнопку просмотра результатов
        main_layout.addWidget(self.exit_button, alignment=Qt.AlignmentFlag.AlignCenter)  # Добавляем кнопку выхода
        self.setLayout(main_layout)

    def button_style(self):
        return "QPushButton {" \
               "background-color: #4285f4; color: white; padding: 10px; border-radius: 5px;" \
               "}" \
               "QPushButton:hover {" \
               "background-color: #357ae8;" \
               "}"

    def update_word_label(self):
        if self.current_word < len(self.test_data):
            word = ''.join(self.test_data[self.current_word])
            self.word_label.setText(word)
        else:
            self.word_label.setText("Конец")
            self.disable_buttons()

    def create_letter_buttons(self):
        # Очистка существующих кнопок из макета
        while self.buttons_layout.count():
            child = self.buttons_layout.takeAt(0)
            if child.widget():
                child.widget().deleteLater()

        self.letter_buttons = []
        current_letters = self.test_data[self.current_word]

        for i, letter in enumerate(current_letters):
            button = QPushButton(letter)
            button.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed)
            button.setFixedSize(40, 40)
            button.setStyleSheet("background-color: #4285f4; color: white;")
            button.clicked.connect(lambda checked, i=i: self.check_answer(i))
            self.letter_buttons.append(button)
            self.buttons_layout.addWidget(button)

    def check_answer(self, index):
        """Проверяет, выбрал ли пользователь правильную букву."""
        if self.current_word >= len(self.correct_answers):
            return  # Предотвращает ошибки, если все слова пройдены

        correct_index = self.correct_answers[self.current_word] - 1
        if index == correct_index:
            QMessageBox.information(self, "Правильно!", "Молодец")
            self.correct_count += 1  # Увеличиваем счётчик правильных ответов
        else:
            ans = self.test_data[self.current_word]
            ans[correct_index] = ans[correct_index].upper()
            ans = ''.join(ans)
            QMessageBox.information(
                self,
                "Неправильно!",
                f"Правильный ответ: {ans}"
            )
        self.next_word()  # Переходим к следующему слову

    def next_word(self):
        self.current_word += 1
        if self.current_word < len(self.test_data):
            self.update_word_label()
            self.create_letter_buttons()
        else:
            percentage = (self.correct_count / self.total_words) * 100 if self.total_words > 0 else 0
            self.test_finished.emit(percentage)
            QMessageBox.information(self, "Закончили", "Все слова пройдены")
            self.disable_buttons()

    def view_results(self):
        if self.current_word == 0:
            percentage = 0
            message = "Ты ещё не дал ни одного ответа."
        else:
            percentage = (self.correct_count / self.current_word) * 100
            message = f"Твой текущий результат: {percentage:.2f}% правильных ответов ({self.correct_count} из {self.current_word})"

        QMessageBox.information(self, "Текущий результат", message)

    def exit_test(self):
        if self.current_word == 0:
            percentage = 0
        else:
            percentage = (self.correct_count / self.current_word) * 100

        self.test_finished.emit(percentage)
        QMessageBox.information(self, "Тест завершён",
                                f"Ты завершил тест с результатом: {percentage:.2f}% правильных ответов ({self.correct_count} из {self.current_word})")
        self.close()

    def disable_buttons(self):
        """Отключает все кнопки букв."""
        for button in self.letter_buttons:
            button.setEnabled(False)


class Poliformizmy2Window(QWidget):
    test_finished = pyqtSignal(float)

    def __init__(self, cursor):
        super().__init__()
        self.setWindowTitle("Тест по Полиморфизмам")
        self.resize(600, 400)
        self.setStyleSheet("background-color: #f0f0f0; font-family: 'Arial';")

        # Загрузка данных из базы данных
        self.load_data()

        # Инициализация текущего состояния
        self.current_index = 0
        self.correct_count = 0
        self.total_questions = len(self.test_data)

        # Перемешивание данных для рандомизации порядка
        random.shuffle(self.test_data)

        # Инициализация и настройка виджетов
        self.init_ui()

        # Первоначальное отображение первого предложения
        self.update_sentence()

    def load_data(self):
        try:
            data = self.cur.execute("SELECT sentence, the_right_one FROM Polymorh").fetchall()
            self.test_data = [{"sentence": row[0], "right_answer": row[1]} for row in data]
        except sqlite3.Error as e:
            QMessageBox.critical(self, "Ошибка базы данных", f"Не удалось загрузить данные:\n{e}")
            sys.exit(1)

        if not self.test_data:
            QMessageBox.information(self, "Нет данных", "В базе данных отсутствуют предложения для тестирования.")
            sys.exit(0)

    def init_ui(self):
        # Метка для отображения текущего предложения
        self.sentence_label = QLabel()
        self.sentence_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.sentence_label.setWordWrap(True)
        self.sentence_label.setStyleSheet("font-size: 20px; padding: 10px;")

        # Поле для ввода ответа
        self.input_field = QLineEdit()
        self.input_field.setPlaceholderText("Введите правильное слово")
        self.input_field.setStyleSheet("padding: 5px;")

        self.check_button = QPushButton("Проверить")
        self.check_button.clicked.connect(self.check_input_answer)
        self.check_button.setStyleSheet(self.button_style())

        self.view_results_button = QPushButton("Посмотреть текущий результат")
        self.view_results_button.clicked.connect(self.show_current_result)
        self.view_results_button.setStyleSheet(self.button_style())

        self.exit_button = QPushButton("Выйти из теста")
        self.exit_button.clicked.connect(self.exit_test)
        self.exit_button.setStyleSheet("background-color: red; color: white; padding: 10px; border-radius: 5px;")

        vbox = QVBoxLayout()
        vbox.addWidget(self.sentence_label)
        vbox.addWidget(self.input_field)
        vbox.addWidget(self.check_button)
        vbox.addWidget(self.view_results_button)
        vbox.addWidget(self.exit_button)
        self.setLayout(vbox)

    def button_style(self):
        return "QPushButton {" \
               "background-color: #4285f4; color: white; padding: 10px; border-radius: 5px;" \
               "}" \
               "QPushButton:hover {" \
               "background-color: #357ae8;" \
               "}"

    def update_sentence(self):
        if self.current_index < self.total_questions:
            sentence = self.test_data[self.current_index]["sentence"]
            self.sentence_label.setText(sentence)
            self.input_field.setText("")
            self.input_field.setFocus()
        else:
            self.show_final_result()
            self.disable_widgets()

    def check_input_answer(self):
        user_answer = self.input_field.text().strip().lower()
        correct_answer = self.test_data[self.current_index]["right_answer"].strip().lower()

        if not user_answer:
            QMessageBox.warning(self, "Внимание", "Пожалуйста, введите ответ перед проверкой.")
            return

        if user_answer == correct_answer:
            QMessageBox.information(self, "Правильно!", "Молодец")
            self.correct_count += 1
        else:
            QMessageBox.information(self, "Неправильно!",
                                    f"Правильный ответ: {self.test_data[self.current_index]['right_answer']}")

        self.current_index += 1
        self.update_sentence()

    def show_final_result(self):
        percentage = (self.correct_count / self.total_questions) * 100 if self.total_questions > 0 else 0
        QMessageBox.information(self, "Результат теста",
                                f"Твой результат: {percentage:.2f}% правильных ответов ({self.correct_count} из {self.total_questions})")
        self.test_finished.emit(percentage)

    def show_current_result(self):
        if self.current_index == 0:
            percentage = 0
            message = "Ты ещё не дал ни одного ответа."
        else:
            percentage = (self.correct_count / self.current_index) * 100
            message = f"Твой текущий результат: {percentage:.2f}% правильных ответов ({self.correct_count} из {self.current_index})"

        QMessageBox.information(self, "Текущий результат", message)

    def exit_test(self):
        if self.current_index == 0:
            percentage = 0
        else:
            percentage = (self.correct_count / self.current_index) * 100

        self.test_finished.emit(percentage)
        QMessageBox.information(self, "Тест завершён",
                                f"Ты завершил тест с результатом: {percentage:.2f}% правильных ответов")
        self.close()

    def disable_widgets(self):
        self.input_field.setDisabled(True)
        self.check_button.setDisabled(True)
        self.view_results_button.setDisabled(True)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())
    conn.close() улучши код, не взлезая в бд и не меняя основные пункты