import sys
import json
from PyQt5.QtWidgets import (
    QApplication, QWidget, QMainWindow, QVBoxLayout, QHBoxLayout,
    QPushButton, QLabel, QComboBox, QSpinBox, QTextEdit, QListView,
    QGraphicsView, QGraphicsScene, QGraphicsRectItem, QGraphicsTextItem,
    QGraphicsItem, QMessageBox, QToolTip
)
from PyQt5.QtGui import (
    QFont, QStandardItemModel, QStandardItem, QBrush, QColor, QPen, QPalette
)
from PyQt5.QtCore import (
    Qt, QRectF, QPointF
)

class BuildingCanvas(QGraphicsView):
    def __init__(self, parent=None):
        super().__init__()
        self.parent_widget = parent
        self.scene = QGraphicsScene()
        self.setScene(self.scene)
        self.setFixedHeight(500)
        self.setFixedWidth(300)
        self.floor_items = []
        self.vertical_items = []
        self.selected_area = None
        self.translations = self.parent_widget.translations

        self.initUI()
        self.setStyleSheet("background-color: #1e1e1e;")  # Dark theme

    def initUI(self):
        self.totalOG = 9  # Number of upper floors
        self.totalUG = 4  # Number of underground floors
        self.floorHeight = 30
        self.createAreas()
        self.drawFloors()
        self.drawVerticalAreas()

    def createAreas(self):
        self.areas = []
        # Upper floors (OG) - from top to bottom
        for i in range(self.totalOG, 0, -1):
            area = {'typ': '1', 'stockwerk': str(i), 'bereich': f"{i}{self.translations['. OG']}"}
            self.areas.append(area)
        # Ground floor (EG)
        self.areas.append({'typ': '1', 'stockwerk': '0', 'bereich': self.translations['EG']})
        # Underground floors (UG)
        for i in range(1, self.totalUG + 1):
            area = {'typ': '0', 'stockwerk': str(i), 'bereich': f"{i}{self.translations['. UG']}"}
            self.areas.append(area)

    def drawFloors(self):
        self.scene.clear()
        self.floor_items = []
        x_offset = 110  # Position for the Stockwerke section
        for idx, area in enumerate(self.areas):
            y = idx * self.floorHeight
            rect = QGraphicsRectItem(x_offset, y, 100, self.floorHeight)
            rect.setPen(QPen(Qt.black))
            rect.setBrush(QBrush(QColor(46, 46, 46)))  # Dark grey
            rect.setData(0, area)
            text = QGraphicsTextItem(area['bereich'], rect)
            text.setDefaultTextColor(Qt.white)
            text.setPos(x_offset + 5, y + 5)
            rect.setFlag(QGraphicsItem.ItemIsSelectable, True)
            rect.setAcceptHoverEvents(True)
            rect.hoverEnterEvent = self.onHoverEnter
            rect.hoverLeaveEvent = self.onHoverLeave
            rect.mousePressEvent = self.onMousePress
            self.scene.addItem(rect)
            self.floor_items.append(rect)
        # Green line for ground floor (EG)
        eg_y = (self.totalOG) * self.floorHeight
        line = self.scene.addLine(x_offset, eg_y, x_offset + 100, eg_y, QPen(Qt.green, 2))
        self.scene.addItem(line)

    def drawVerticalAreas(self):
        # Treppenhaus
        x_offset = 0  # Position for the Treppenhaus section
        # Treppenhaus UG
        area_ug = {'typ': '5', 'stockwerk': '0', 'bereich': self.translations['Treppenhaus UG']}
        rect_ug = QGraphicsRectItem(x_offset, (self.totalOG) * self.floorHeight, 100, self.totalUG * self.floorHeight)
        rect_ug.setPen(QPen(Qt.black))
        rect_ug.setBrush(QBrush(QColor(46, 46, 46)))  # Dark grey
        rect_ug.setData(0, area_ug)
        text_ug = QGraphicsTextItem(area_ug['bereich'], rect_ug)
        text_ug.setDefaultTextColor(Qt.white)
        text_ug.setRotation(-90)
        text_ug.setPos(x_offset + 15, (self.totalOG + self.totalUG) * self.floorHeight - 10)
        rect_ug.setFlag(QGraphicsItem.ItemIsSelectable, True)
        rect_ug.setAcceptHoverEvents(True)
        rect_ug.hoverEnterEvent = self.onHoverEnter
        rect_ug.hoverLeaveEvent = self.onHoverLeave
        rect_ug.mousePressEvent = self.onMousePress
        self.scene.addItem(rect_ug)
        self.vertical_items.append(rect_ug)

        # Treppenhaus EG bis 9. OG
        area_eg = {'typ': '6', 'stockwerk': '0', 'bereich': self.translations['Treppenhaus EG bis 9. OG']}
        rect_eg = QGraphicsRectItem(x_offset, 0, 100, self.totalOG * self.floorHeight)
        rect_eg.setPen(QPen(Qt.black))
        rect_eg.setBrush(QBrush(QColor(46, 46, 46)))  # Dark grey
        rect_eg.setData(0, area_eg)
        text_eg = QGraphicsTextItem(area_eg['bereich'], rect_eg)
        text_eg.setDefaultTextColor(Qt.white)
        text_eg.setRotation(-90)
        text_eg.setPos(x_offset + 15, self.totalOG * self.floorHeight - 10)
        rect_eg.setFlag(QGraphicsItem.ItemIsSelectable, True)
        rect_eg.setAcceptHoverEvents(True)
        rect_eg.hoverEnterEvent = self.onHoverEnter
        rect_eg.hoverLeaveEvent = self.onHoverLeave
        rect_eg.mousePressEvent = self.onMousePress
        self.scene.addItem(rect_eg)
        self.vertical_items.append(rect_eg)

        # Liftschacht
        x_offset = 220  # Position for the Liftschacht section
        area_lift = {'typ': '6', 'stockwerk': '0', 'bereich': self.translations['Liftschacht']}
        rect_lift = QGraphicsRectItem(x_offset, 0, 80, (self.totalOG + self.totalUG + 1) * self.floorHeight)
        rect_lift.setPen(QPen(Qt.black))
        rect_lift.setBrush(QBrush(QColor(46, 46, 46)))  # Dark grey
        rect_lift.setData(0, area_lift)
        text_lift = QGraphicsTextItem(area_lift['bereich'], rect_lift)
        text_lift.setDefaultTextColor(Qt.white)
        text_lift.setRotation(-90)
        text_lift.setPos(x_offset + 15, (self.totalOG + self.totalUG + 1) * self.floorHeight / 2)
        rect_lift.setFlag(QGraphicsItem.ItemIsSelectable, True)
        rect_lift.setAcceptHoverEvents(True)
        rect_lift.hoverEnterEvent = self.onHoverEnter
        rect_lift.hoverLeaveEvent = self.onHoverLeave
        rect_lift.mousePressEvent = self.onMousePress
        self.scene.addItem(rect_lift)
        self.vertical_items.append(rect_lift)

    def translateLabels(self):
        self.createAreas()
        for idx, rect in enumerate(self.floor_items):
            area = self.areas[idx]
            rect.setData(0, area)
            for item in rect.childItems():
                if isinstance(item, QGraphicsTextItem):
                    item.setPlainText(area['bereich'])
        # Update vertical areas
        for rect in self.vertical_items:
            area = rect.data(0)
            if area['typ'] == '5':
                area['bereich'] = self.translations['Treppenhaus UG']
            elif area['typ'] == '6' and self.translations['Treppenhaus EG bis 9. OG'] in area['bereich']:
                area['bereich'] = self.translations['Treppenhaus EG bis 9. OG']
            elif area['typ'] == '6' and self.translations['Liftschacht'] in area['bereich']:
                area['bereich'] = self.translations['Liftschacht']
            rect.setData(0, area)
            for item in rect.childItems():
                if isinstance(item, QGraphicsTextItem):
                    item.setPlainText(area['bereich'])

    def onHoverEnter(self, event):
        item = event.widget()
        item.setBrush(QBrush(QColor(255, 152, 0)))  # Orange
        # Tooltip
        area = item.data(0)
        tooltip_text = f"{self.translations['Bereich:']} {area['bereich']}\n"
        tooltip_text += f"{self.translations['Typ:']} {area['typ']}\n"
        tooltip_text += f"{self.translations['Stockwerk:']} {area['stockwerk']}\n"
        QToolTip.showText(QCursor.pos(), tooltip_text)

    def onHoverLeave(self, event):
        item = event.widget()
        item.setBrush(QBrush(QColor(46, 46, 46)))  # Dark grey
        QToolTip.hideText()

    def onMousePress(self, event):
        item = event.widget()
        area = item.data(0)
        if area:
            self.selected_area = area
            self.parent_widget.updateSelections(
                typ=area['typ'],
                stockwerk=area['stockwerk'],
                bereich=area['bereich']
            )
            for floor_item in self.floor_items + self.vertical_items:
                if floor_item == item:
                    floor_item.setBrush(QBrush(QColor(255, 152, 0)))  # Orange
                else:
                    floor_item.setBrush(QBrush(QColor(46, 46, 46)))  # Dark grey
        else:
            self.clearSelection()

    def clearSelection(self):
        self.selected_area = None
        self.parent_widget.updateSelections(
            typ=None,
            stockwerk=None,
            bereich=None
        )
        for item in self.floor_items + self.vertical_items:
            item.setBrush(QBrush(QColor(46, 46, 46)))  # Dark grey

class GroupNumberGeneratorWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.currentLanguage = 'de'
        self.translations = self.getTranslations()
        self.selectedGebaeude = None
        self.selectedTyp = None
        self.selectedStockwerk = None
        self.selectedBereich = None
        self.selectedMeldertyp = None

        self.initUI()
        self.setStyleSheet("background-color: #1e1e1e; color: white;")  # Dark theme

    def initUI(self):
        main_layout = QHBoxLayout(self)

        # Left side: Building Canvas and Explanation Box
        left_layout = QVBoxLayout()

        # Language Switcher
        language_layout = QHBoxLayout()
        self.languageToggle = QPushButton('Français')
        self.languageToggle.clicked.connect(self.switchLanguage)
        language_layout.addStretch()
        language_layout.addWidget(self.languageToggle)
        left_layout.addLayout(language_layout)

        # Building Canvas
        self.buildingCanvas = BuildingCanvas(self)
        left_layout.addWidget(self.buildingCanvas)

        # Explanation Box
        self.explanation_box = QTextEdit()
        self.explanation_box.setReadOnly(True)
        self.explanation_box.setStyleSheet("background-color: #2c2c2c; color: white;")
        left_layout.addWidget(self.explanation_box)

        main_layout.addLayout(left_layout)

        # Right side: Controls and List View
        right_layout = QVBoxLayout()

        # Gebäudeauswahl
        gebaeude_layout = QHBoxLayout()
        self.gebaeude_label = QLabel(self.translations['Gebäude auswählen:'])
        self.gebaeude_label.setStyleSheet("color: white;")
        self.gebaeudeSelect = QComboBox()
        self.gebaeudeSelect.setStyleSheet("background-color: #2c2c2c; color: white;")
        self.gebaeudeSelect.addItem(self.translations['Bitte Gebäude auswählen'], "")
        for i in range(1, 10):
            self.gebaeudeSelect.addItem(f"{self.translations['Gebäude']} {i}", str(i))
        self.gebaeudeSelect.currentIndexChanged.connect(self.updateGebaeude)
        gebaeude_layout.addWidget(self.gebaeude_label)
        gebaeude_layout.addWidget(self.gebaeudeSelect)
        right_layout.addLayout(gebaeude_layout)

        # Meldertyp Buttons
        meldertyp_layout = QVBoxLayout()
        self.meldertyp_label = QLabel(self.translations['Meldertyp'])
        self.meldertyp_label.setStyleSheet("color: white;")
        meldertyp_layout.addWidget(self.meldertyp_label)
        self.meldertyp_buttons = []
        meldertypen = [
            (self.translations['Automatische Melder (AM)'], "AM"),
            (self.translations['Handfeuermelder (HFM)'], "HFM"),
            (self.translations['Spezialgruppe'], "Spezial"),
            (self.translations['Direkt Feuer Alarm (DFA)'], "DFA")
        ]
        for text, typ in meldertypen:
            btn = QPushButton(text)
            btn.setCheckable(True)
            btn.clicked.connect(self.updateMeldertyp)
            btn.meldertyp = typ
            btn.setStyleSheet("background-color: #2c2c2c; color: white;")
            meldertyp_layout.addWidget(btn)
            self.meldertyp_buttons.append(btn)
        right_layout.addLayout(meldertyp_layout)

        # Number Inputs
        num_layout = QHBoxLayout()
        self.num_label = QLabel(self.translations['Freie Nummer:'])
        self.num_label.setStyleSheet("color: white;")
        self.num_input = QSpinBox()
        self.num_input.setRange(1, 90)
        self.num_input.setValue(1)
        self.num_input.setStyleSheet("background-color: #2c2c2c; color: white;")
        num_layout.addWidget(self.num_label)
        num_layout.addWidget(self.num_input)
        right_layout.addLayout(num_layout)

        anzahl_layout = QHBoxLayout()
        self.anzahl_label = QLabel(self.translations['Anzahl der Gruppennummern:'])
        self.anzahl_label.setStyleSheet("color: white;")
        self.anzahl_input = QSpinBox()
        self.anzahl_input.setRange(1, 99)
        self.anzahl_input.setValue(5)
        self.anzahl_input.setStyleSheet("background-color: #2c2c2c; color: white;")
        anzahl_layout.addWidget(self.anzahl_label)
        anzahl_layout.addWidget(self.anzahl_input)
        right_layout.addLayout(anzahl_layout)

        # Generate Button
        self.generate_button = QPushButton(self.translations['Gruppennummern generieren'])
        self.generate_button.clicked.connect(self.generateNumbers)
        self.generate_button.setStyleSheet("background-color: #2c2c2c; color: white;")
        right_layout.addWidget(self.generate_button)

        # List View
        self.list_view = QListView()
        self.list_model = QStandardItemModel()
        self.list_view.setModel(self.list_model)
        self.list_view.setSelectionMode(QListView.MultiSelection)
        self.list_view.clicked.connect(self.copySelection)
        self.list_view.setStyleSheet("background-color: #2c2c2c; color: white;")
        right_layout.addWidget(self.list_view)

        main_layout.addLayout(right_layout)

        self.translateUI()

    def getTranslations(self):
        translations = {
            'de': {
                'Gebäude auswählen:': 'Gebäude auswählen:',
                'Bitte Gebäude auswählen': 'Bitte Gebäude auswählen',
                'Gebäude': 'Gebäude',
                'Meldertyp': 'Meldertyp',
                'Automatische Melder (AM)': 'Automatische Melder (AM)',
                'Handfeuermelder (HFM)': 'Handfeuermelder (HFM)',
                'Spezialgruppe': 'Spezialgruppe',
                'Direkt Feuer Alarm (DFA)': 'Direkt Feuer Alarm (DFA)',
                'Freie Nummer:': 'Freie Nummer:',
                'Anzahl der Gruppennummern:': 'Anzahl der Gruppennummern:',
                'Gruppennummern generieren': 'Gruppennummern generieren',
                'Erste Gruppennummer:': 'Erste Gruppennummer:',
                'Gebäude:': 'Gebäude:',
                'Meldertyp:': 'Meldertyp:',
                '. OG': '. OG',
                '. UG': '. UG',
                'EG': 'EG',
                'Treppenhaus UG': 'Treppenhaus UG',
                'Treppenhaus EG bis 9. OG': 'Treppenhaus EG bis 9. OG',
                'Liftschacht': 'Liftschacht',
                'Fehler': 'Fehler',
                'Bitte Gebäude auswählen.': 'Bitte Gebäude auswählen.',
                'Bitte Meldertyp auswählen.': 'Bitte Meldertyp auswählen.',
                'Bitte einen Bereich auswählen.': 'Bitte einen Bereich auswählen.',
                'Bereich:': 'Bereich:',
                'Typ:': 'Typ:',
                'Stockwerk:': 'Stockwerk:',
            },
            'fr': {
                'Gebäude auswählen:': 'Sélectionner un bâtiment :',
                'Bitte Gebäude auswählen': 'Veuillez sélectionner un bâtiment',
                'Gebäude': 'Bâtiment',
                'Meldertyp': 'Type de détecteur',
                'Automatische Melder (AM)': 'Détecteurs automatiques (AM)',
                'Handfeuermelder (HFM)': 'Déclencheurs manuels (HFM)',
                'Spezialgruppe': 'Groupe spécial',
                'Direkt Feuer Alarm (DFA)': 'Alarme directe incendie (DFA)',
                'Freie Nummer:': 'Numéro libre :',
                'Anzahl der Gruppennummern:': 'Nombre de numéros de groupe :',
                'Gruppennummern generieren': 'Générer numéros de groupe',
                'Erste Gruppennummer:': 'Premier numéro de groupe :',
                'Gebäude:': 'Bâtiment :',
                'Meldertyp:': 'Type de détecteur :',
                '. OG': 'e étage',
                '. UG': 'e SS',
                'EG': 'RDC',
                'Treppenhaus UG': 'Escalier SS',
                'Treppenhaus EG bis 9. OG': 'Escalier RDC au 9e étage',
                'Liftschacht': 'Puits d\'ascenseur',
                'Fehler': 'Erreur',
                'Bitte Gebäude auswählen.': 'Veuillez sélectionner un bâtiment.',
                'Bitte Meldertyp auswählen.': 'Veuillez sélectionner un type de détecteur.',
                'Bitte einen Bereich auswählen.': 'Veuillez sélectionner une zone.',
                'Bereich:': 'Zone :',
                'Typ:': 'Type :',
                'Stockwerk:': 'Étages :',
            }
        }
        return translations[self.currentLanguage]

    def translateUI(self):
        self.translations = self.getTranslations()
        self.languageToggle.setText('Français' if self.currentLanguage == 'de' else 'Deutsch')
        self.gebaeude_label.setText(self.translations['Gebäude auswählen:'])
        self.meldertyp_label.setText(self.translations['Meldertyp'])
        self.num_label.setText(self.translations['Freie Nummer:'])
        self.anzahl_label.setText(self.translations['Anzahl der Gruppennummern:'])
        self.generate_button.setText(self.translations['Gruppennummern generieren'])
        # Update Gebäude Select
        self.gebaeudeSelect.clear()
        self.gebaeudeSelect.addItem(self.translations['Bitte Gebäude auswählen'], "")
        for i in range(1, 10):
            self.gebaeudeSelect.addItem(f"{self.translations['Gebäude']} {i}", str(i))
        # Update Meldertyp Buttons
        meldertypen = [
            (self.translations['Automatische Melder (AM)'], "AM"),
            (self.translations['Handfeuermelder (HFM)'], "HFM"),
            (self.translations['Spezialgruppe'], "Spezial"),
            (self.translations['Direkt Feuer Alarm (DFA)'], "DFA")
        ]
        for btn, (text, typ) in zip(self.meldertyp_buttons, meldertypen):
            btn.setText(text)
            btn.meldertyp = typ
        self.buildingCanvas.translateLabels()
        self.updateExplanationBox()

    def switchLanguage(self):
        self.currentLanguage = 'fr' if self.currentLanguage == 'de' else 'de'
        self.translateUI()

    def updateGebaeude(self):
        self.selectedGebaeude = self.gebaeudeSelect.currentData()
        self.updateExplanationBox()

    def updateMeldertyp(self):
        sender = self.sender()
        for btn in self.meldertyp_buttons:
            btn.setChecked(False)
        sender.setChecked(True)
        self.selectedMeldertyp = sender.meldertyp
        self.updateExplanationBox()

    def updateSelections(self, typ, stockwerk, bereich):
        self.selectedTyp = typ
        self.selectedStockwerk = stockwerk
        self.selectedBereich = bereich
        self.updateExplanationBox()

    def generateNumbers(self):
        if not self.selectedGebaeude:
            QMessageBox.warning(self, self.translations['Fehler'], self.translations['Bitte Gebäude auswählen.'])
            return
        if not self.selectedMeldertyp:
            QMessageBox.warning(self, self.translations['Fehler'], self.translations['Bitte Meldertyp auswählen.'])
            return
        if not self.selectedTyp or not self.selectedStockwerk:
            QMessageBox.warning(self, self.translations['Fehler'], self.translations['Bitte einen Bereich auswählen.'])
            return

        nummer = self.num_input.value()
        anzahlGruppen = self.anzahl_input.value()
        melderListe = []

        if self.selectedMeldertyp in ['AM', 'Spezial']:
            for i in range(anzahlGruppen):
                num = nummer + i
                if num > 99:
                    break
                numStr = str(num).zfill(2)
                gruppennummer = f"{self.selectedGebaeude}{self.selectedTyp}{self.selectedStockwerk}{numStr}"
                melderListe.append(gruppennummer)
        elif self.selectedMeldertyp in ['HFM', 'DFA']:
            for i in range(anzahlGruppen):
                num = 100 - (nummer + i)
                if num < 1:
                    break
                numStr = str(num).zfill(2)
                gruppennummer = f"{self.selectedGebaeude}{self.selectedTyp}{self.selectedStockwerk}{numStr}"
                melderListe.append(gruppennummer)

        self.updateExplanationBox(melderListe[0] if melderListe else "")
        self.list_model.clear()
        for num in melderListe:
            item = QStandardItem(num)
            self.list_model.appendRow(item)

    def updateExplanationBox(self, firstNumber=""):
        text = ""
        text += f"{self.translations['Erste Gruppennummer:']} {firstNumber}\n"
        text += f"{self.translations['Gebäude:']} {self.selectedGebaeude}\n"
        text += f"{self.translations['Meldertyp:']} {self.selectedMeldertyp}\n"
        text += f"{self.translations['Typ:']} {self.selectedTyp}\n"
        text += f"{self.translations['Stockwerk:']} {self.selectedStockwerk}\n"
        text += f"{self.translations['Bereich:']} {self.selectedBereich}\n"
        self.explanation_box.setText(text)

    def copySelection(self):
        selected = self.list_view.selectedIndexes()
        numbers = [self.list_model.item(idx.row()).text() for idx in selected]
        clipboard = QApplication.clipboard()
        clipboard.setText('\n'.join(numbers))

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Gruppennummer Generator")
        self.resize(1000, 600)
        self.initUI()

        # Apply dark theme
        self.setStyleSheet("background-color: #1e1e1e; color: white;")
        palette = QPalette()
        palette.setColor(QPalette.Window, QColor("#1e1e1e"))
        palette.setColor(QPalette.WindowText, Qt.white)
        self.setPalette(palette)

    def initUI(self):
        widget = QWidget()
        layout = QVBoxLayout(widget)

        self.group_number_generator = GroupNumberGeneratorWidget()
        layout.addWidget(self.group_number_generator)

        self.setCentralWidget(widget)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_()) ich habe vorhin probleme mit einem chat mit dir , dass war der code von dem. das programm startet aber nicht, kannst du mir den code korrigiert komplett senden.