#!/usr/bin/python3

import os
import sys

from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QMainWindow, QPushButton, QFileDialog, QMessageBox, \
    QLabel, QListWidget, QGroupBox, QVBoxLayout, QAbstractItemView
from msg_parser import MsOxMessage

version = '1.0'


class MyWindow(QMainWindow):

    def __init__(self):
        QMainWindow.__init__(self)
        self.folder_to_save = os.getenv('HOME')
        self.initUI()

    def fix_message(self, message_file, id='', sender=''):
        with open(message_file, 'r') as inp:
            lines = inp.readlines()

        id_found = False
        from_found = False
        for i in range(len(lines)):
            if lines[i].strip() == '':
                break
            if lines[i].strip().startswith('From:'):
                from_found = True
            if lines[i].strip().startswith('Message-ID'):
                id_found = True

        if not from_found:
            if not sender:
                sender = 'None <none@example.com>'
            lines.insert(i, f'From: {sender}\n')

        if not id_found:
            if not id:
                id = '<1234567890>'
            lines.insert(i, f'Message-ID: {id}\n')

        if not from_found or not id_found:
            with open(message_file, 'w') as out:
                print(*lines, sep='', file=out)

    def choose_files(self):
        files, ok = QFileDialog.getOpenFileNames(None, "Выберите файл(ы)",
                                                 "/home", "Outlook files(*.msg)")
        if ok:
            self.chosen_files = files
            self.chosen_files_list.clear()
            self.chosen_files_list.addItems(self.chosen_files)

    def select_destination_folder(self):
        folder = QFileDialog.getExistingDirectory(
            None, 'Выберите директорию для сохранения'
        )
        if folder:
            self.folder_to_save = folder
            self.chosen_folder_label.setText(f'Директория для сохранения: {self.folder_to_save}')

    def delete_selected_files(self):
        selected_files = self.chosen_files_list.selectedItems()
        for file in selected_files:
            if file.text() in self.chosen_files:
                self.chosen_files.remove(file.text())
        self.chosen_files_list.clear()
        self.chosen_files_list.addItems(self.chosen_files)

    def convert_message(self):
        if self.chosen_files:
            try:
                for file in self.chosen_files:
                    msg_obj = MsOxMessage(file)
                    message_id = msg_obj.header_dict.get('Message-ID')
                    message_sender = msg_obj.header_dict.get('From')

                    msg_obj.save_email_file(file_path=self.folder_to_save)
                    self.fix_message(
                        os.path.join(self.folder_to_save, msg_obj.subject + '.eml'),
                        id=message_id,
                        sender=message_sender
                    )

                text = 'Конвертация завершена успешно'
            except Exception as e:
                text = f'Возникла ошибка: {e}'
        else:
            text = 'Выберите файлы'
        dlg = QMessageBox()
        dlg.setWindowTitle('Внимание')
        dlg.setText(text)
        dlg.exec_()

    def initUI(self):
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        grid = QGridLayout()
        central_widget.setLayout(grid)
        self.choose_file_btn = QPushButton('Выберите файлы')
        self.choose_file_btn.clicked.connect(self.choose_files)
        grid.addWidget(self.choose_file_btn, 0, 0)

        self.chosen_files = []
        self.chosen_files_groupbox = QGroupBox('Выбранные файлы')
        chosen_files_groupbox_layout = QVBoxLayout()
        self.chosen_files_groupbox.setLayout(chosen_files_groupbox_layout)

        self.chosen_files_list = QListWidget()
        self.chosen_files_list.setSelectionMode(QAbstractItemView.ExtendedSelection)
        chosen_files_groupbox_layout.addWidget(self.chosen_files_list)
        delete_files_button = QPushButton('Удалить файлы')
        delete_files_button.clicked.connect(self.delete_selected_files)
        chosen_files_groupbox_layout.addWidget(delete_files_button)
        grid.addWidget(self.chosen_files_groupbox, 0, 1)

        select_destination_folder_button = QPushButton('Выберите папку для сохранения')
        select_destination_folder_button.clicked.connect(self.select_destination_folder)
        grid.addWidget(select_destination_folder_button, 1, 0)

        self.chosen_folder_label = QLabel(f'Директория для сохранения: {self.folder_to_save}')
        self.chosen_folder_label.setWordWrap(True)
        grid.addWidget(self.chosen_folder_label, 1, 1)

        convert_msg_button = QPushButton('Конвертировать')
        convert_msg_button.clicked.connect(self.convert_message)
        grid.addWidget(convert_msg_button, 2, 0, 1, 2)

        self.setGeometry(50, 50, 700, 100)
        self.setWindowIcon(QIcon('mos-msgconverter.svg'))
        self.setWindowTitle(f"Конвертер сообщений ver. {version}")
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindow()
    sys.exit(app.exec_())
