
# Спроектируй классы: преподователь, группа, дисциплина,
# занятие, журнал занятий. Построить диаграмму классов.
# Написать программу, демонстрирущую работу с классами.
# Сформировать и вывести в Excel Отчет преподователя о выполнении нагрузки.
# Данные хранить в текстовых файлых.


import sys
from typing import List
import openpyxl
from PyQt6.QtWidgets import (
    QApplication, QMainWindow, QTableWidget, QTableWidgetItem,
    QPushButton, QVBoxLayout, QWidget, QLineEdit, QLabel, QHBoxLayout, QComboBox, QMessageBox
)
from PyQt6.QtCore import Qt


# Классы для хранения данных
class Teacher:
    def __init__(self, teacher_id: int, name: str):
        self.id = teacher_id
        self.name = name
        self.disciplines = []  # Список дисциплин, которые ведет преподаватель

    def add_discipline(self, discipline):
        self.disciplines.append(discipline)


class Discipline:
    def __init__(self, discipline_id: int, name: str):
        self.id = discipline_id
        self.name = name


class Group:
    def __init__(self, group_id: int, name: str, students: List[str]):
        self.id = group_id
        self.name = name
        self.students = students


class Lesson:
    def __init__(self, lesson_id: int, date: str, time: str, teacher: Teacher, discipline: Discipline, group: Group, status: str):
        self.id = lesson_id
        self.date = date
        self.time = time
        self.teacher = teacher
        self.discipline = discipline
        self.group = group
        self.status = status  # Статус занятия: "Проведено" или "Не проведено"


class Journal:
    def __init__(self):
        self.lessons = []  # Список всех занятий

    def add_lesson(self, lesson: Lesson):
        self.lessons.append(lesson)

    def get_teacher_report(self, teacher_id: int):
        """Получение отчета по преподавателю"""
        report = []
        for lesson in self.lessons:
            if lesson.teacher.id == teacher_id:
                report.append({
                    "Дата": lesson.date,
                    "Время": lesson.time,
                    "Дисциплина": lesson.discipline.name,
                    "Группа": lesson.group.name,
                    "Статус": lesson.status
                })
        return report


def save_to_excel(report: List[dict], file_name: str):
    """Сохранение отчета в файл Excel"""
    workbook = openpyxl.Workbook()
    sheet = workbook.active
    sheet.title = "Отчет преподавателя"

    # Заголовки таблицы
    headers = ["Дата", "Время", "Дисциплина", "Группа", "Статус"]
    sheet.append(headers)

    # Данные
    for row in report:
        sheet.append([row["Дата"], row["Время"], row["Дисциплина"], row["Группа"], row["Статус"]])

    # Сохранение файла
    workbook.save(file_name)


# Интерфейс на PyQt6
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Журнал преподавателей")
        self.setGeometry(100, 100, 800, 600)

        # Создаем основные данные
        self.journal = Journal()

        # Преподаватели, дисциплины, группы
        self.teachers = [
            Teacher(1, "Иванов Иван Иванович"),
            Teacher(2, "Петров Петр Петрович")
        ]
        self.disciplines = [
            Discipline(1, "Математика"),
            Discipline(2, "Физика")
        ]
        self.groups = [
            Group(1, "Группа А", ["Студент 1", "Студент 2"]),
            Group(2, "Группа Б", ["Студент 3", "Студент 4"])
        ]
        self.teachers[0].add_discipline(self.disciplines[0])
        self.teachers[0].add_discipline(self.disciplines[1])

        # Основной виджет
        main_layout = QVBoxLayout()

        # Таблица для отображения занятий
        self.table = QTableWidget()
        self.table.setColumnCount(5)
        self.table.setHorizontalHeaderLabels(["Дата", "Время", "Дисциплина", "Группа", "Статус"])
        main_layout.addWidget(self.table)

        # Поля для добавления занятия
        form_layout = QHBoxLayout()

        self.date_input = QLineEdit()
        self.date_input.setPlaceholderText("Дата (YYYY-MM-DD)")
        form_layout.addWidget(self.date_input)

        self.time_input = QLineEdit()
        self.time_input.setPlaceholderText("Время (HH:MM)")
        form_layout.addWidget(self.time_input)

        self.teacher_input = QComboBox()
        self.teacher_input.addItems([teacher.name for teacher in self.teachers])
        form_layout.addWidget(self.teacher_input)

        self.discipline_input = QComboBox()
        self.discipline_input.addItems([discipline.name for discipline in self.disciplines])
        form_layout.addWidget(self.discipline_input)

        self.group_input = QComboBox()
        self.group_input.addItems([group.name for group in self.groups])
        form_layout.addWidget(self.group_input)

        self.status_input = QComboBox()
        self.status_input.addItems(["Проведено", "Не проведено"])
        form_layout.addWidget(self.status_input)

        main_layout.addLayout(form_layout)

        # Кнопки
        button_layout = QHBoxLayout()
        self.add_button = QPushButton("Добавить занятие")
        self.add_button.clicked.connect(self.add_lesson)
        button_layout.addWidget(self.add_button)

        self.report_button = QPushButton("Сформировать отчет")
        self.report_button.clicked.connect(self.generate_report)
        button_layout.addWidget(self.report_button)

        main_layout.addLayout(button_layout)

        # Основной виджет
        container = QWidget()
        container.setLayout(main_layout)
        self.setCentralWidget(container)

    def add_lesson(self):
        """Добавление нового занятия"""
        date = self.date_input.text()
        time = self.time_input.text()
        teacher = self.teachers[self.teacher_input.currentIndex()]
        discipline = self.disciplines[self.discipline_input.currentIndex()]
        group = self.groups[self.group_input.currentIndex()]
        status = self.status_input.currentText()

        # Создаем новое занятие
        lesson = Lesson(len(self.journal.lessons) + 1, date, time, teacher, discipline, group, status)
        self.journal.add_lesson(lesson)

        # Обновляем таблицу
        self.update_table()
        QMessageBox.information(self, "Успех", "Занятие добавлено!")

    def update_table(self):
        """Обновление таблицы занятий"""
        self.table.setRowCount(len(self.journal.lessons))
        for row, lesson in enumerate(self.journal.lessons):
            self.table.setItem(row, 0, QTableWidgetItem(lesson.date))
            self.table.setItem(row, 1, QTableWidgetItem(lesson.time))
            self.table.setItem(row, 2, QTableWidgetItem(lesson.discipline.name))
            self.table.setItem(row, 3, QTableWidgetItem(lesson.group.name))
            self.table.setItem(row, 4, QTableWidgetItem(lesson.status))

    def generate_report(self):
        """Генерация отчета в Excel для выбранного преподавателя"""
        teacher = self.teachers[self.teacher_input.currentIndex()]
        report = self.journal.get_teacher_report(teacher.id)
        file_name = f"Отчет_{teacher.name.replace(' ', '_')}.xlsx"
        save_to_excel(report, file_name)
        QMessageBox.information(self, "Успех", f"Отчет сохранен в файл {file_name}")


# Запуск приложения
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())
