CoreAccountSettingsPage::CoreAccountSettingsPage(QWidget *parent)
    : SettingsPage(tr("Remote Cores"), QString(), parent),
    _lastAccountId(0),
    _lastAutoConnectId(0),
    _standalone(false)
{
    ui.setupUi(this);
    initAutoWidgets();
    ui.addAccountButton->setIcon(SmallIcon("list-add"));
    ui.editAccountButton->setIcon(SmallIcon("document-edit"));
    ui.deleteAccountButton->setIcon(SmallIcon("edit-delete"));

    _model = new CoreAccountModel(Client::coreAccountModel(), this);
    _filteredModel = new FilteredCoreAccountModel(_model, this);

    ui.accountView->setModel(filteredModel());
    ui.autoConnectAccount->setModel(filteredModel());

    connect(filteredModel(), SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), SLOT(rowsAboutToBeRemoved(QModelIndex, int, int)));
    connect(filteredModel(), SIGNAL(rowsInserted(QModelIndex, int, int)), SLOT(rowsInserted(QModelIndex, int, int)));

    connect(ui.accountView->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), SLOT(setWidgetStates()));
    connect(ui.autoConnectAccount, SIGNAL(currentIndexChanged(int)), SLOT(widgetHasChanged()));
    setWidgetStates();
}
void CoreAccountSettingsPage::load()
{
    model()->update(Client::coreAccountModel());
    SettingsPage::load();

    CoreAccountSettings s;

    if (Quassel::runMode() != Quassel::Monolithic) {
        // make sure we don't have selected the internal account as autoconnect account

        if (s.autoConnectOnStartup() && s.autoConnectToFixedAccount()) {
            CoreAccount acc = model()->account(s.autoConnectAccount());
            if (acc.isInternal())
                ui.autoConnectOnStartup->setChecked(false);
        }
    }
    ui.accountView->setCurrentIndex(filteredModel()->index(0, 0));
    ui.accountView->selectionModel()->select(filteredModel()->index(0, 0), QItemSelectionModel::Select);

    QModelIndex idx = filteredModel()->mapFromSource(model()->accountIndex(s.autoConnectAccount()));
    ui.autoConnectAccount->setCurrentIndex(idx.isValid() ? idx.row() : 0);
    ui.autoConnectAccount->setProperty("storedValue", ui.autoConnectAccount->currentIndex());
    setWidgetStates();
    // Mark as no changes made, we just loaded settings
    setChangedState(false);
}
void CoreAccountSettingsPage::editAccount(const QModelIndex &index) {
  if(!index.isValid())
    return;

  CoreAccountEditDlg dlg(model()->account(filteredModel()->mapToSource(index)), this);
  if(dlg.exec() == QDialog::Accepted) {
    AccountId id = model()->createOrUpdateAccount(dlg.account());
    ui.accountView->setCurrentIndex(filteredModel()->mapFromSource(model()->accountIndex(id)));
    widgetHasChanged();
  }
}
void CoreAccountSettingsPage::rowsInserted(const QModelIndex &index, int start, int end) {
  if(index.isValid() || start != end)
    return;

  // check if the inserted index was just removed and select it in that case
  AccountId id = filteredModel()->index(start, 0).data(CoreAccountModel::AccountIdRole).value<AccountId>();
  if(id == _lastAccountId)
    ui.accountView->setCurrentIndex(filteredModel()->index(start, 0));
  if(id == _lastAutoConnectId)
    ui.autoConnectAccount->setCurrentIndex(start);
  _lastAccountId = _lastAutoConnectId = 0;
}
void CoreAccountSettingsPage::on_addAccountButton_clicked() {
  CoreAccountEditDlg dlg(CoreAccount(), this);
  if(dlg.exec() == QDialog::Accepted) {
    AccountId id =model()->createOrUpdateAccount(dlg.account());
    ui.accountView->setCurrentIndex(filteredModel()->mapFromSource(model()->accountIndex(id)));
    widgetHasChanged();
  }
}
void CoreAccountSettingsPage::save() {
  SettingsPage::save();
  Client::coreAccountModel()->update(model());
  Client::coreAccountModel()->save();
  CoreAccountSettings s;
  AccountId id = filteredModel()->index(ui.autoConnectAccount->currentIndex(), 0).data(CoreAccountModel::AccountIdRole).value<AccountId>();
  s.setAutoConnectAccount(id);
  ui.autoConnectAccount->setProperty("storedValue", ui.autoConnectAccount->currentIndex());
}
// TODO: Qt 4.6 - replace by proper rowsMoved() semantics
// NOTE: This is the filtered model
void CoreAccountSettingsPage::rowsAboutToBeRemoved(const QModelIndex &index, int start, int end) {
  _lastAutoConnectId = _lastAccountId = 0;
  if(index.isValid() || start != end)
    return;

  // the current index is removed, so remember it in case it's reinserted immediately afterwards
  AccountId id = filteredModel()->index(start, 0).data(CoreAccountModel::AccountIdRole).value<AccountId>();
  if(start == ui.accountView->currentIndex().row())
    _lastAccountId = id;
  if(start == ui.autoConnectAccount->currentIndex())
    _lastAutoConnectId = id;
}
void CoreAccountSettingsPage::setSelectedAccount(AccountId accId)
{
    QModelIndex index = filteredModel()->mapFromSource(model()->accountIndex(accId));
    if (index.isValid())
        ui.accountView->setCurrentIndex(index);
}