from PyQt6 import QtCore, uic
from PyQt6.QtWidgets import QDialogButtonBox

from vorta.i18n import trans_late, translate
from vorta.store.models import BackupProfileModel
from vorta.utils import get_asset

uifile = get_asset('UI/profileadd.ui')
AddProfileUI, AddProfileBase = uic.loadUiType(uifile)


class AddProfileWindow(AddProfileBase, AddProfileUI):
    profile_changed = QtCore.pyqtSignal(str, int)

    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
        self.setAttribute(QtCore.Qt.WidgetAttribute.WA_DeleteOnClose)
        self.edited_profile = None

        self.buttonBox.rejected.connect(self.close)
        self.buttonBox.accepted.connect(self.save)
        self.profileNameField.textChanged.connect(self.button_validation)

        self.buttonBox.button(QDialogButtonBox.StandardButton.Save).setText(self.tr("Save"))
        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setText(self.tr("Cancel"))

        self.name_blank = trans_late('AddProfileWindow', 'Please enter a profile name.')
        self.name_exists = trans_late('AddProfileWindow', 'A profile with this name already exists.')
        # Call validate to set initial messages
        self.buttonBox.button(QDialogButtonBox.StandardButton.Save).setEnabled(self.validate())

    def _set_status(self, text):
        self.errorText.setText(text)
        self.errorText.repaint()

    def save(self):
        new_profile = BackupProfileModel(name=self.profileNameField.text())
        new_profile.save()
        self.profile_changed.emit(new_profile.name, new_profile.id)
        self.accept()

    def button_validation(self):
        self.buttonBox.button(QDialogButtonBox.StandardButton.Save).setEnabled(self.validate())

    def validate(self):
        name = self.profileNameField.text()
        # A name was entered?
        if len(name) == 0:
            self._set_status(translate('AddProfileWindow', self.name_blank))
            return False

        # Profile with this name already exists?
        exists = BackupProfileModel.select().where(BackupProfileModel.name == name).count()
        if exists > 0:
            self._set_status(translate('AddProfileWindow', self.name_exists))
            return False

        self._set_status('')
        return True


class EditProfileWindow(AddProfileWindow):
    def __init__(self, parent=None, rename_existing_id=None):
        super().__init__(parent)
        existing_profile = BackupProfileModel.get(id=rename_existing_id)
        self.profileNameField.setText(existing_profile.name)
        self.existing_id = rename_existing_id
        self.modalTitle.setText(self.tr('Rename Profile'))

    def save(self):
        renamed_profile = BackupProfileModel.get(id=self.existing_id)
        renamed_profile.name = self.profileNameField.text()
        renamed_profile.save()
        self.profile_changed.emit(renamed_profile.name, renamed_profile.id)
        self.accept()
