//=============================================================================
//
//   File : OptionsWidget_sound.cpp
//   Creation date : Fri Sep  6 02:18:23 2002 GMT by Szymon Stefanek
//
//   This file is part of the KVsound sound client distribution
//   Copyright (C) 2002-2010 Szymon Stefanek (pragma at kvsound dot 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
//=============================================================================

#include "OptionsWidget_sound.h"

#include "kvi_settings.h"
#include "KviLocale.h"
#include "KviOptions.h"
#include "KviModuleManager.h"
#include "KviPointerList.h"
#include "KviCString.h"
#include "KviTalHBox.h"
#include "KviTalToolTip.h"
#include "KviApplication.h"

#include <QLabel>
#include <QPushButton>

// FIXME: This module doesn't ???? properly when auto-detection is performed!

OptionsWidget_sound::OptionsWidget_sound(QWidget * pParent)
    : KviOptionsWidget(pParent)
{
}

OptionsWidget_sound::~OptionsWidget_sound()
    = default;

OptionsWidget_soundGeneral::OptionsWidget_soundGeneral(QWidget * parent)
    : KviOptionsWidget(parent)
{
	m_bFirstShow = true;

	setObjectName("sound_system_options_widget");
	createLayout();

	KviTalGroupBox * g = addGroupBox(0, 0, 0, 0, Qt::Horizontal, __tr2qs_ctx("Sound System", "options"), true);

	KviTalToolTip::add(g, __tr2qs_ctx("This allows you to select the sound system to be used with KVIrc.", "options"));

	KviTalHBox * h = new KviTalHBox(g);

	m_pSoundSystemBox = new QComboBox(h);

	m_pSoundAutoDetectButton = new QPushButton(__tr2qs_ctx("Auto-detect", "options"), h);
	connect(m_pSoundAutoDetectButton, SIGNAL(clicked()), this, SLOT(soundAutoDetect()));

	m_pSoundTestButton = new QPushButton(__tr2qs_ctx("Test", "options"), h);
	connect(m_pSoundTestButton, SIGNAL(clicked()), this, SLOT(soundTest()));

	g = addGroupBox(0, 1, 0, 1, Qt::Horizontal, __tr2qs_ctx("Media Player", "options"), true);

	KviTalToolTip::add(g, __tr2qs_ctx("This allows you to select the preferred media player to be used with "
	                                  "the mediaplayer.* module commands and functions.",
	                          "options"));

	h = new KviTalHBox(g);

	m_pMediaPlayerBox = new QComboBox(h);

	m_pMediaAutoDetectButton = new QPushButton(__tr2qs_ctx("Auto-detect", "options"), h);
	connect(m_pMediaAutoDetectButton, SIGNAL(clicked()), this, SLOT(mediaAutoDetect()));

	m_pMediaTestButton = new QPushButton(__tr2qs_ctx("Test", "options"), h);
	connect(m_pMediaTestButton, SIGNAL(clicked()), this, SLOT(mediaTest()));

	m_pMediaTestButton->setEnabled(false);

	g = addGroupBox(0, 2, 0, 2, Qt::Horizontal, __tr2qs_ctx("ID3 Tags Encoding", "options"), true);

	KviTalToolTip::add(g, __tr2qs_ctx("This allows you to select encoding of mp3 tags.", "options"));

	h = new KviTalHBox(g);

	m_pTagsEncodingCombo = new QComboBox(h);
	m_pTagsEncodingCombo->addItem(__tr2qs_ctx("Use Language Encoding", "options"));

	int i = 0;
	int iMatch = 0;

	KviLocale::EncodingDescription * d = KviLocale::instance()->encodingDescription(i);
	while(d->pcName)
	{
		if(KviQString::equalCI(d->pcName, KVI_OPTION_STRING(KviOption_stringMp3TagsEncoding)))
			iMatch = i + 1;
		m_pTagsEncodingCombo->insertItem(m_pTagsEncodingCombo->count(), d->pcName);
		i++;
		d = KviLocale::instance()->encodingDescription(i);
	}
	m_pTagsEncodingCombo->setCurrentIndex(iMatch);

#if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW)
	g = addGroupBox(0, 3, 0, 3, Qt::Horizontal, __tr2qs_ctx("Winamp messages encoding", "options"), true);

	KviTalToolTip::add(g, __tr2qs_ctx("This allows you to select encoding of winamp messages.", "options"));

	h = new KviTalHBox(g);

	m_pWinampEncodingCombo = new QComboBox(h);

	m_pWinampEncodingCombo->addItem(__tr2qs_ctx("Use Language Encoding", "options"));
	i = 0;
	iMatch = 0;

	d = KviLocale::instance()->encodingDescription(i);
	while(d->pcName)
	{
		if(KviQString::equalCI(d->pcName, KVI_OPTION_STRING(KviOption_stringWinampTextEncoding)))
			iMatch = i + 1;
		m_pWinampEncodingCombo->insertItem(m_pWinampEncodingCombo->count(), d->pcName);
		i++;
		d = KviLocale::instance()->encodingDescription(i);
	}
	m_pWinampEncodingCombo->setCurrentIndex(iMatch);

	addRowSpacer(0, 4, 0, 4);
#else
	addRowSpacer(0, 3, 0, 3);
#endif
}

OptionsWidget_soundGeneral::~OptionsWidget_soundGeneral()
    = default;

void OptionsWidget_soundGeneral::showEvent(QShowEvent *)
{
	if(!m_bFirstShow)
		return;
	// We fill these boxes only before the first show since the soundFillBox()
	// is likely to trigger sound system-detection which may take time...

	g_pApp->setOverrideCursor(Qt::WaitCursor);

	soundFillBox();
	mediaFillBox();

	g_pApp->restoreOverrideCursor();

	m_bFirstShow = false;
}

void OptionsWidget_soundGeneral::soundTest()
{
	QString szSavedSoundSystem = KVI_OPTION_STRING(KviOption_stringSoundSystem);
	KVI_OPTION_STRING(KviOption_stringSoundSystem) = m_pSoundSystemBox->currentText();

	KviModule * m = g_pModuleManager->getModule("snd");

	if(!m)
		return; // doh

	QString szFileName;

	if(!g_pApp->findAudioFile(szFileName, QString::fromUtf8("jingle.wav")))
	{
		qDebug("Can't find the jingle.wav file: was it shipped with your KVIrc installation?");
		return;
	}

	m->ctrl("play", &szFileName);

	KVI_OPTION_STRING(KviOption_stringSoundSystem) = szSavedSoundSystem;
}

void OptionsWidget_soundGeneral::mediaTest()
{
}

void OptionsWidget_soundGeneral::soundAutoDetect()
{
	KviModule * m = g_pModuleManager->getModule("snd");
	if(!m)
		return;

	g_pApp->setOverrideCursor(Qt::WaitCursor);

	soundFillBox();
	QString szSoundSystem;
	if(m->ctrl("detectSoundSystem", &szSoundSystem) && !KviQString::equalCI(szSoundSystem, "null"))
	{
		int idx = m_pSoundSystemBox->findText(szSoundSystem);
		if(idx > -1) {
			m_pSoundSystemBox->setCurrentIndex(idx);
		}
	}

	g_pApp->restoreOverrideCursor();
}

void OptionsWidget_soundGeneral::mediaAutoDetect()
{
	KviModule * m = g_pModuleManager->getModule("mediaplayer");
	if(!m)
		return;

	g_pApp->setOverrideCursor(Qt::WaitCursor);

	m->ctrl("detectMediaPlayer", nullptr);
	mediaFillBox();

	g_pApp->restoreOverrideCursor();
}

void OptionsWidget_soundGeneral::soundFillBox()
{
	QStringList l;
	unsigned int cnt, i;
	KviModule * m = g_pModuleManager->getModule("snd");

	if(!m || !m->ctrl("getAvailableSoundSystems", &l))
	{
		m_pSoundSystemBox->clear();
		m_pSoundSystemBox->setEnabled(false);
		m_pSoundTestButton->setEnabled(false);
		m_pSoundAutoDetectButton->setEnabled(false);
		return;
	}

	m_pSoundSystemBox->clear();
	m_pSoundSystemBox->addItems(l);

	int idx = m_pSoundSystemBox->findText(KVI_OPTION_STRING(KviOption_stringSoundSystem));
	if(idx == -1) {
		// the previously used sound system doesn't exist anymore, force an autodetect
		g_pApp->setOverrideCursor(Qt::WaitCursor);
		QString szSoundSystem;
		m->ctrl("detectSoundSystem", &szSoundSystem);
		g_pApp->restoreOverrideCursor();
		idx = m_pSoundSystemBox->findText(szSoundSystem);
	}

	m_pSoundSystemBox->setCurrentIndex(idx);
}

void OptionsWidget_soundGeneral::mediaFillBox()
{
	QStringList l;
	unsigned int cnt, i;
	KviModule * m = g_pModuleManager->getModule("mediaplayer");

	if(!m || !m->ctrl("getAvailableMediaPlayers", &l))
		goto disable;

	m_pMediaPlayerBox->clear();

	for(const auto& it : l)
		m_pMediaPlayerBox->addItem(it);

	cnt = m_pMediaPlayerBox->count();
	for(i = 0; i < cnt; i++)
	{
		QString t = m_pMediaPlayerBox->itemText(i);
		if(KviQString::equalCI(t, KVI_OPTION_STRING(KviOption_stringPreferredMediaPlayer)))
		{
			m_pMediaPlayerBox->setCurrentIndex(i);
			break;
		}
	}

	return;
disable:
	m_pMediaPlayerBox->clear();
	m_pMediaPlayerBox->setEnabled(false);
	m_pMediaTestButton->setEnabled(false);
	m_pMediaAutoDetectButton->setEnabled(false);
}

void OptionsWidget_soundGeneral::commit()
{
	// avoid to commit if we've never been shown (and initialized)
	if(m_bFirstShow)
		return;

	KviOptionsWidget::commit();
	KVI_OPTION_STRING(KviOption_stringSoundSystem) = m_pSoundSystemBox->currentText();
	KVI_OPTION_STRING(KviOption_stringPreferredMediaPlayer) = m_pMediaPlayerBox->currentText();

	int idx = m_pTagsEncodingCombo->currentIndex();
	if(idx <= 0)
	{
		// guess from locale
		KVI_OPTION_STRING(KviOption_stringMp3TagsEncoding) = "";
	}
	else
	{
		KVI_OPTION_STRING(KviOption_stringMp3TagsEncoding) = m_pTagsEncodingCombo->itemText(idx);
	}

#if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW)
	idx = m_pWinampEncodingCombo->currentIndex();
	if(idx <= 0)
	{
		// guess from locale
		KVI_OPTION_STRING(KviOption_stringWinampTextEncoding) = "";
	}
	else
	{
		KVI_OPTION_STRING(KviOption_stringWinampTextEncoding) = m_pWinampEncodingCombo->itemText(idx);
	}
#endif
}

OptionsWidget_sounds::OptionsWidget_sounds(QWidget * parent)
    : KviOptionsWidget(parent)
{
	setObjectName("sound_options_widget");
	createLayout();
	addLabel(0, 0, 0, 0, __tr2qs_ctx("New query opened:", "options"));
	addSoundSelector(1, 0, 1, 0, "", KviOption_stringOnNewQueryOpenedSound);

	addLabel(0, 1, 0, 1, __tr2qs_ctx("New message in inactive query:", "options"));
	addSoundSelector(1, 1, 1, 1, "", KviOption_stringOnQueryMessageSound);

	addLabel(0, 2, 0, 2, __tr2qs_ctx("Highlighted message in inactive window:", "options"));
	addSoundSelector(1, 2, 1, 2, "", KviOption_stringOnHighlightedMessageSound);

	addLabel(0, 3, 0, 3, __tr2qs_ctx("When I am kicked:", "options"));
	addSoundSelector(1, 3, 1, 3, "", KviOption_stringOnMeKickedSound);

	addRowSpacer(0, 4, 1, 4);
}

OptionsWidget_sounds::~OptionsWidget_sounds()
    = default;
