/***************************************************************************
 *   Copyright (C) 2004 by Emil Stoyanov                                   *
 *   emosto@users.sourceforge.net                                          *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/


#include "kiaxprefswindow.h"


KiaxPrefsWindow::KiaxPrefsWindow(KiaxPrefs * iaxSettings, QWidget* parent, const char* name, bool modal, WFlags fl)
    : KiaxPrefsWindowUi(parent,name, modal,fl)
{
  edittedAccNumber =-1;
  settings = iaxSettings;
  settings->detectDevices();
  // prepare widgets
  initWidgets();
  setAudioFields();
  // insert account names in accountsListBox;
  loadAccountsList();
  setMiscFields();

}

KiaxPrefsWindow::~KiaxPrefsWindow() {}

void KiaxPrefsWindow::initWidgets()
{
  accountsListBox->clear();
  accountNameEdit->setText("");
  serverEdit->setText("");
  usernameEdit->setText("");
  passwordEdit->setText("");
  callerIdEdit->setText("");
  callerIdNumberEdit->setText("");
  registerAccountCheckBox->setChecked(false);
  enableControls(false);
}

void KiaxPrefsWindow::enableControls(bool en) {
  accountNameEdit->setEnabled(en);
  serverEdit->setEnabled(en);
  usernameEdit->setEnabled(en);
  passwordEdit->setEnabled(en);
  callerIdEdit->setEnabled(en);
  callerIdNumberEdit->setEnabled(en);
  deleteAccountButton->setEnabled(en);
  makeDefaultCheckBox->setEnabled(en);
  codecsGroup->setEnabled(en);
  registerAccountCheckBox->setEnabled(en);
}

void KiaxPrefsWindow::buttonOk_clicked()
{
  // set the values of the currently selected account in gui
  //    otherwise the changes will be lost
  int accNumber = accountsListBox->currentItem();
  setAccountValues(accNumber);
  setAudioValues();
  setMiscValues();
  // then save everything
  settings->saveSettings();
  accept();
}

void KiaxPrefsWindow::loadAccountsList()
{
  int accCount = settings->getAccounts().count();
  for (int i=0;i<accCount; i++)
  {
    KiaxAccount * account = settings->getAccount(i);
    accountsListBox->insertItem(account->accAlias,i);
  }
  if (accCount>0)
  {
    accountsListBox->setSelected(0, true);
    enableControls(true);
  }
  else
  {
    initWidgets();
  }
}

void KiaxPrefsWindow::setFieldsValues(int accountNumber)
{
  KiaxAccount * account = settings->getAccount(accountNumber);
  if (account)
  {
    accountNameEdit->setText(account->accAlias);
    serverEdit->setText(account->iaxServer);
    usernameEdit->setText(account->username);
    passwordEdit->setText(account->password);
    callerIdEdit->setText(account->callerId);
    callerIdNumberEdit->setText(account->callerIdNumber);
    setCodecByName(account->codec);
    makeDefaultCheckBox->setChecked(settings->getDefaultAccountId()==account->accId);
    registerAccountCheckBox->setChecked(!account->registerAccount);
  }
}

void KiaxPrefsWindow::setAccountValues(int accNumber)
{
  if (accNumber<0)
    return;
  KiaxAccount * account = settings->getAccount(accNumber);
  if (account)
  {
    account->accAlias = accountNameEdit->text();
    account->iaxServer = serverEdit->text();
    account->username = usernameEdit->text();
    account->password = passwordEdit->text();
    account->callerId = callerIdEdit->text();
    account->callerIdNumber = callerIdNumberEdit->text();
    account->codec = getSelectedCodecName();
    account->registerAccount = !registerAccountCheckBox->isChecked();
  }
}

void KiaxPrefsWindow::setMiscValues() {
    settings->setDocked(dockedCheckBox->isChecked());
    settings->setHiddenOnStartup(hiddenOnStartupCheckBox->isChecked());
    settings->setConnectedOnStartup(connectedOnStartupCheckBox->isChecked());
    settings->setRaiseWindow(raiseWindowCheckBox->isChecked());
    settings->setMaxCalls(maxCallsSpinBox->value());
    settings->setExecCommandOnRing(executeCommandCheckbox->isChecked());
    settings->setCommandOnRing(executeCommandLineEdit->text());
}

void KiaxPrefsWindow::setMiscFields() {
    dockedCheckBox->setChecked(settings->isDocked());
    hiddenOnStartupCheckBox->setChecked(settings->isHiddenOnStartup());
    connectedOnStartupCheckBox->setChecked(settings->isConnectedOnStartup());
    raiseWindowCheckBox->setChecked(settings->getRaiseWindow());
    maxCallsSpinBox->setValue(settings->getMaxCalls());
    executeCommandCheckbox->setChecked(settings->getExecCommandOnRing());
    executeCommandLineEdit->setEnabled(settings->getExecCommandOnRing());
    executeCommandLabel->setEnabled(settings->getExecCommandOnRing());
    executeCommandLineEdit->setText(settings->getCommandOnRing());
}

void KiaxPrefsWindow::setAudioValues()
{
  // set the values of the selected input/output devices
  settings->setInputDevice(inputDeviceComboBox->currentItem());
  settings->setOutputDevice(outputDeviceComboBox->currentItem());
  settings->setRingDevice(ringDeviceComboBox->currentItem());
  // set filters
  int aFilterFlag = 0;
  if (noiseReductionCheckBox->isChecked()) aFilterFlag |= IAXC_FILTER_DENOISE;
  if (aagcCheckBox->isChecked()) aFilterFlag |= IAXC_FILTER_AAGC;
  if (agcCheckBox->isChecked()) aFilterFlag |= IAXC_FILTER_AGC;
  if (echoCancelationCheckBox->isChecked()) aFilterFlag |= IAXC_FILTER_ECHO;
  if (comfortNoiseCheckBox->isChecked()) aFilterFlag |= IAXC_FILTER_CN;
  settings->setFilterFlag(aFilterFlag);
  if (silenceSuppressionCheckBox->isChecked()) settings->setSilenceThreshold(1);//auto
  else settings->setSilenceThreshold(-99);
  settings->setIncomingRingMute(incomingRingMuteCheckBox->isChecked());
  settings->setOutgoingRingMute(outgoingRingMuteCheckBox->isChecked());
  
}

void KiaxPrefsWindow::setAudioFields() {
  // audio devices
  for (uint i=0;i<settings->getInputDeviceNames().count(); i++)
    inputDeviceComboBox->insertItem(*settings->getInputDeviceNames().at(i),i);
  for (uint i=0;i<settings->getOutputDeviceNames().count(); i++)
    outputDeviceComboBox->insertItem(*settings->getOutputDeviceNames().at(i),i);
  for (uint i=0;i<settings->getRingDeviceNames().count(); i++)
    ringDeviceComboBox->insertItem(*settings->getRingDeviceNames().at(i),i);
  inputDeviceComboBox->setCurrentItem(settings->getInputDevice());
  outputDeviceComboBox->setCurrentItem(settings->getOutputDevice());
  ringDeviceComboBox->setCurrentItem(settings->getRingDevice());
  // filters
  noiseReductionCheckBox->setChecked(settings->getFilterFlag()&IAXC_FILTER_DENOISE);
  aagcCheckBox->setChecked(settings->getFilterFlag()&IAXC_FILTER_AAGC);
  agcCheckBox->setChecked(settings->getFilterFlag()&IAXC_FILTER_AGC);
  echoCancelationCheckBox->setChecked(settings->getFilterFlag()&IAXC_FILTER_ECHO);
  comfortNoiseCheckBox->setChecked(settings->getFilterFlag()&IAXC_FILTER_CN);
  if (settings->getSilenceThreshold()==1) silenceSuppressionCheckBox->setChecked(true);
  incomingRingMuteCheckBox->setChecked(settings->getIncomingRingMute());
  outgoingRingMuteCheckBox->setChecked(settings->getOutgoingRingMute());
}

void KiaxPrefsWindow::accountSelected(int accNumber)
{
  // save the entered in the form values
  if (edittedAccNumber>-1)
    setAccountValues(edittedAccNumber);
  edittedAccNumber = accNumber;
  if (accNumber > -1)
    setFieldsValues(accNumber);
}

void KiaxPrefsWindow::makeDefaultClicked()
{
  settings->setDefaultAccountId(settings->getAccount(accountsListBox->currentItem())->accId);
}

void KiaxPrefsWindow::deleteAccountClicked()
{
  // remove from account settings file
  uint accIndex = accountsListBox->currentItem();
  settings->removeAccount(accIndex);
  edittedAccNumber =-1; // reset the previous editted account number
  accountsListBox->removeItem(accIndex);
  if (accountsListBox->count()>0)
    if (accIndex<accountsListBox->count())accountsListBox->setSelected(accIndex, true);
    else accountsListBox->setSelected(accountsListBox->count()-1, true);
  else initWidgets();
}

QString KiaxPrefsWindow::getSelectedCodecName()
{
  QString result = "gsm";
  if (ilbcRadioButton->isChecked())
    result = "ilbc";
  if (gsmRadioButton->isChecked())
    result = "gsm";
  if (speexRadioButton->isChecked())
    result = "speex";
  if (ulawRadioButton->isChecked())
    result = "ulaw";
  return result;
}

void KiaxPrefsWindow::setCodecByName(QString codecName)
{
  ilbcRadioButton->setChecked(codecName == "ilbc");
  gsmRadioButton->setChecked(codecName == "gsm");
  speexRadioButton->setChecked(codecName == "speex");
  ulawRadioButton->setChecked(codecName == "ulaw");
}

void KiaxPrefsWindow::newAccountClicked()
{
  // remember the values of the currently selected account
  setAccountValues(edittedAccNumber);
  // create a new account
  int accIndex = settings->createNewAccount(0); // 0 = let the account generate its id
  settings->getAccount(accIndex)->accAlias = "Account#" + QString::number(settings->getAccounts().count());
  // mark the new as being editted
  edittedAccNumber = accIndex; // avoid overwriting of former selected account
  // show the default values in the fields
  setFieldsValues(accIndex);
  // insert the name of the account in the list
  accountsListBox->insertItem(settings->getAccount(accIndex)->accAlias,accIndex);
  accountsListBox->setSelected(accIndex,true);
  // and save the account in settings
  setAccountValues(accIndex);
  settings->saveAccount(accIndex);

  enableControls(true);

}

void KiaxPrefsWindow::accountNameEdit_lostFocus() // we want to update the accountname in the listbox
{
  QString tt = accountNameEdit->text();
  accountsListBox->changeItem(QString(accountNameEdit->text()), accountsListBox->currentItem());
}

void	KiaxPrefsWindow::executeCommandCheckbox_toggled(bool checked) {
	executeCommandLabel->setEnabled(checked);
	executeCommandLineEdit->setEnabled(checked);
}



syntax highlighted by Code2HTML, v. 0.9.1