import os
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5 import uic
import pandas as pd


def resource_path(relative_path):
    base_path = getattr(
        sys, "_MEIPASS", os.path.dirname(os.path.abspath(__file__))
    )
    return os.path.join(base_path, relative_path)

form = resource_path("input_output.ui")
form_class = uic.loadUiType(form)[0]


class WindowClass(QMainWindow, form_class):

    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.btnInput.clicked.connect(self.fileload)
        self.btnAI.clicked.connect(self.AIDetection)
        self.btnDownload.clicked.connect(self.downloadTable)

        self.imageList = []

    def fileload(self):
        for i in reversed(range(self.inputImages.count())):
            widget = self.inputImages.itemAt(i).widget()
            self.inputImages.removeWidget(widget)
            widget.setParent(None)
            
        image_filter = "이미지 파일 (*.png *.jpg *.bmp *.gif *.jpeg)"
        self.imageList, _ = QFileDialog.getOpenFileNames(self, "이미지 파일 업로드", filter=image_filter)
    
        self.inputImageWidget = QWidget()
        self.inputImageLayout = QGridLayout(self.inputImageWidget)

        row, col = 0, 0
        for image_path in self.imageList:
            pixmap = QPixmap(image_path)
            label = QLabel()
            label.setPixmap(pixmap)
            label.setScaledContents(True)
            label.setFixedSize(300, 250)

            file_name_label = QLabel(os.path.basename(image_path))
            self.inputImageLayout.addWidget(label, row, col)
            self.inputImageLayout.addWidget(file_name_label, row + 1, col)

            col += 1
            if col == 2:
                col = 0
                row += 2

        scrollArea = QScrollArea()
        scrollArea.setWidgetResizable(True)
        scrollArea.setWidget(self.inputImageWidget)
        self.inputImages.addWidget(scrollArea)

    def AIDetection(self):
        if not self.imageList:
            QMessageBox.warning(self, "알림", "이미지 파일을 업로드해주세요.", QMessageBox.Ok)
            return
        
        self.outputImages.clear()

        # # Stitching
        # image_label = QLabel()
        # pixmap = QPixmap(self.imageList[0])
        # image_label.setPixmap(pixmap.scaledToWidth(800).scaledToHeight(300))
        # image_label.setAlignment(Qt.AlignCenter)
        # self.outputImages.addTab(image_label, 'Stitching')

        # # Detection
        # image_label = QLabel()
        # pixmap = QPixmap(self.imageList[1])
        # image_label.setPixmap(pixmap.scaledToWidth(800).scaledToHeight(300))
        # image_label.setAlignment(Qt.AlignCenter)
        # self.outputImages.addTab(image_label, 'Detection')

        # CAD
        image_path = 'result.svg'
        image_label = QLabel()
        pixmap = QPixmap(image_path)
        image_label.setPixmap(pixmap.scaledToWidth(800).scaledToHeight(300))
        image_label.setAlignment(Qt.AlignCenter)
        self.outputImages.addTab(image_label, 'CAD')

        # Table
        csv_path = 'detection_coor.csv'
        df = pd.read_csv(csv_path)
        class_data = {'class_1': {'count': 0, 'areas': 0},
                      'class_2': {'count': 0, 'areas': 0},
                      'class_3': {'count': 0, 'areas': 0},
                      'class_4': {'count': 0, 'areas': 0}}

        for idx, row in df.iterrows():
            label = row['label']
            area = (row['x2'] - row['x1']) * (row['y2'] - row['y1'])
            class_data[label]['count'] += 1
            class_data[label]['areas'] += area

        for col_idx, value in enumerate(class_data.values()):
            item_count = QTableWidgetItem(str(value['count']))
            item_areas = QTableWidgetItem(str(value['areas']))
            self.outputTable.setItem(0, col_idx, item_count)
            self.outputTable.setItem(1, col_idx, item_areas)

    def downloadTable(self):
        file_path, _ = QFileDialog.getSaveFileName(self, "Download Excel", "", "Excel Files (*.xlsx)")
        if file_path:
            df = pd.DataFrame()
            for row in range(self.outputTable.rowCount()):
                row_data = []
                for column in range(self.outputTable.columnCount()):
                    item = self.outputTable.item(row, column)
                    if item is not None:
                        row_data.append(item.text())
                    else:
                        row_data.append('')
                df = pd.concat([df, pd.DataFrame([row_data])])

            df.columns = ['균열', '박리/박락', '백태', '철근 노출']
            df.index = ['수량', '총면적(pixel)']
            df.to_excel(file_path, sheet_name='Crack Result', index=True)
            
            writer = pd.ExcelWriter(file_path, engine='xlsxwriter')
            df.to_excel(writer, sheet_name='Crack Result', index=True)

            worksheet = writer.sheets['Crack Result']
            for i in range(df.shape[1] + 1):
                worksheet.set_column(i, i, 15)

            writer.close()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWindow = WindowClass()
    myWindow.setWindowTitle("SSIMS (Auto concrete damage detector)")
    myWindow.show()
    app.exec_()