import os

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


class ConfigWindow(QDialog):
	"""
	Server settings window class
	"""
	
	def __init__(self, config):
		super().__init__()
		self.config = config
		self.initUI()
	
	def initUI(self):
		"""
		Settings window
		:return:
		"""
		self.setFixedSize(365, 260)
		self.setWindowTitle('Настройки сервера')
		self.setAttribute(Qt.WA_DeleteOnClose)
		self.setModal(True)
		
		# Надпись о файле базы данных:
		self.db_path_label = QLabel('Путь до файла базы данных: ', self)
		self.db_path_label.move(10, 10)
		self.db_path_label.setFixedSize(240, 15)
		
		# Строка с путём базы
		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_file_label = QLabel('Имя файла базы данных: ', self)
		self.db_file_label.move(10, 68)
		self.db_file_label.setFixedSize(180, 15)
		
		# Поле для ввода имени файла
		self.db_file = QLineEdit(self)
		self.db_file.move(200, 66)
		self.db_file.setFixedSize(150, 20)
		
		# Метка с номером порта
		self.port_label = QLabel('Номер порта для соединений:', self)
		self.port_label.move(10, 108)
		self.port_label.setFixedSize(180, 15)
		
		# Поле для ввода номера порта
		self.port = QLineEdit(self)
		self.port.move(200, 108)
		self.port.setFixedSize(150, 20)
		
		# Метка с адресом для соединений
		self.ip_label = QLabel('С какого IP принимаем соединения:', self)
		self.ip_label.move(10, 148)
		self.ip_label.setFixedSize(180, 15)
		
		# Метка с напоминанием о пустом поле.
		self.ip_label_note = QLabel(
			' оставьте это поле пустым, чтобы\n принимать соединения с любых адресов.',
			self)
		self.ip_label_note.move(10, 168)
		self.ip_label_note.setFixedSize(500, 30)
		
		# Поле для ввода ip
		self.ip = QLineEdit(self)
		self.ip.move(200, 148)
		self.ip.setFixedSize(150, 20)
		
		# Кнопка сохранения настроек
		self.save_btn = QPushButton('Сохранить', self)
		self.save_btn.move(190, 220)
		
		# Кнапка закрытия окна
		self.close_button = QPushButton('Закрыть', self)
		self.close_button.move(275, 220)
		self.close_button.clicked.connect(self.close)
		
		self.db_path_select.clicked.connect(self.open_file_dialog)
		
		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_btn.clicked.connect(self.save_server_config)
	
	def open_file_dialog(self):
		"""
		Folder selection window handler method
		:return:
		"""
		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):
		"""
		The method for saving the settings.
		Checks the correctness of the entered data and
		if everything is correct, it saves the ini file.
		:return:
		"""
		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.ini'}", 'w') as conf:
					self.config.write(conf)
					message.information(
						self, 'OK', 'Настройки успешно сохранены!')
			else:
				message.warning(
					self, 'Ошибка', 'Порт должен быть от 1024 до 65536')
