from PyQt5.QtWidgets import QDialog, QLabel, QLineEdit, QPushButton, QFileDialog, QMessageBox
from PyQt5.QtCore import Qt
import os


class ConfigWindow(QDialog):
    """
    Класс, определяющий и создающий окно изменения настроек сервера
    """

    def __init__(self, config):
        super().__init__()
        self.config = config

        self.setWindowTitle('Настройки сервера')
        self.setFixedSize(365, 260)

        self.db_path_label = QLabel('Путь до файла базы данных: ', self)
        self.db_path_label.setFixedSize(250, 15)
        self.db_path_label.move(10, 10)

        self.db_path = QLineEdit(self)
        self.db_path.setFixedSize(250, 20)
        self.db_path.move(10, 30)
        self.db_path.setReadOnly(True)

        self.db_path_select = QPushButton('Обзор', self)
        self.db_path_select.move(275, 28)
        self.db_path_select.clicked.connect(self.open_file_dialog)

        self.db_file_label = QLabel('Имя файла базы данных: ', self)
        self.db_file_label.setFixedSize(180, 15)
        self.db_file_label.move(10, 68)

        self.db_file = QLineEdit(self)
        self.db_file.setFixedSize(150, 20)
        self.db_file.move(200, 66)

        self.port_label = QLabel('Номер порта для соединений: ', self)
        self.port_label.setFixedSize(180, 15)
        self.port_label.move(10, 108)

        self.port = QLineEdit(self)
        self.port.setFixedSize(150, 20)
        self.port.move(200, 108)

        self.ip_label = QLabel('С какого IP принимать соединения: ', self)
        self.ip_label.setFixedSize(180, 15)
        self.ip_label.move(10, 148)

        self.ip_label_note = QLabel('Оставьте это поле пустым, чтобы\n принимать соединения с любых адресов', self)
        self.ip_label_note.setFixedSize(500, 30)
        self.ip_label_note.move(10, 168)

        self.ip = QLineEdit(self)
        self.ip.setFixedSize(150, 20)
        self.ip.move(200, 148)

        self.save_button = QPushButton('Сохранить', self)
        self.save_button.move(190, 200)
        self.close_button = QPushButton('Закрыть', self)
        self.close_button.move(275, 220)
        self.close_button.clicked.connect(self.close)

        self.show()

        self.db_path.insert(self.config['SETTINGS']['Database_path'])
        self.db_file.insert(self.config['SETTINGS']['Database_file'])
        self.port.insert(self.config['SETTINGS']['Default_port'])
        self.ip.insert(self.config['SETTINGS']['Listen_Address'])
        self.save_button.clicked.connect(self.save_server_config)

    def open_file_dialog(self):
        """
        Метод, окрывающий окно определения пути до файла базы данных сервера
        """

        global dialog
        dialog = QFileDialog(self)
        path = dialog.getExistingDirectory()
        path = path.replace('/', '\\')
        self.db_path.clear()
        self.db_path.insert(path)

    def save_server_config(self):
        """
        Метод, проверяющий введённые данные на корректность и сохраняющий настройки в файле, если они корректны
        """

        global config_window
        message = QMessageBox()
        self.config['SETTINGS']['Database_path'] = self.db_path.text()
        self.config['SETTINGS']['Database_file'] = self.db_file.text()
        try:
            port = int(self.port.text())
        except ValueError:
            message.warning(self, 'Ошибка', 'Порт должен быть числом')
        else:
            self.config['SETTINGS']['Listen_Address'] = self.ip.text()
            if 1023 < port < 65536:
                self.config['SETTINGS']['Default_port'] = str(port)
                dir_path = os.path.dirname(os.path.realpath(__file__))
                dir_path = os.path.join(dir_path, '../../..')
                with open(f"{dir_path}/{'server_dist+++.ini'}", 'w') as conf:
                    self.config.write(conf)
                    message.information(
                        self, 'OK', 'Настройки успешно сохранены!')
            else:
                message.warning(
                    self, 'Ошибка', 'Порт должен быть от 1024 до 65536')
