/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * 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.
 *
 * This file contains configuration functionality
 */

//#define USE_3FLAGS 1

#include "tinsel/config.h"
#include "tinsel/dw.h"
#include "tinsel/sound.h"
#include "tinsel/music.h"

#include "common/file.h"
#include "common/config-manager.h"

#include "audio/mixer.h"

namespace Tinsel {

Config::Config(TinselEngine *vm) : _vm(vm) {
	_dclickSpeed = DOUBLE_CLICK_TIME;
	_musicVolume = Audio::Mixer::kMaxChannelVolume;
	_soundVolume = Audio::Mixer::kMaxChannelVolume;
	_voiceVolume = Audio::Mixer::kMaxChannelVolume;
	_textSpeed = DEFTEXTSPEED;
	_useSubtitles = false;
	_swapButtons = false;
	_language = TXT_ENGLISH;
	_isAmericanEnglishVersion = false;
}


/**
 * Write settings to config manager and flush the config file to disk.
 */
void Config::writeToDisk() {
	ConfMan.setInt("dclick_speed", _dclickSpeed);
	ConfMan.setInt("music_volume", _musicVolume);
	ConfMan.setInt("sfx_volume", _soundVolume);
	ConfMan.setInt("speech_volume", _voiceVolume);
	ConfMan.setInt("talkspeed", (_textSpeed * 255) / 100);
	ConfMan.setBool("subtitles", _useSubtitles);
	//ConfMan.setBool("swap_buttons", _swapButtons ? 1 : 0);

	// Store language for multilingual versions
	if ((_vm->getFeatures() & GF_USE_3FLAGS) || (_vm->getFeatures() & GF_USE_4FLAGS) || (_vm->getFeatures() & GF_USE_5FLAGS)) {
		Common::Language lang;
		switch (_language) {
		case TXT_FRENCH:
			lang = Common::FR_FRA;
			break;
		case TXT_GERMAN:
			lang = Common::DE_DEU;
			break;
		case TXT_SPANISH:
			lang = Common::ES_ESP;
			break;
		case TXT_ITALIAN:
			lang = Common::IT_ITA;
			break;
		case TXT_US:
			lang = Common::EN_USA;
			break;
		default:
			lang = Common::EN_ANY;
		}

		ConfMan.set("language", Common::getLanguageCode(lang));
	}

	// Write to disk
	ConfMan.flushToDisk();
}

/**
 * Read configuration settings from the config file into memory
 */
void Config::readFromDisk() {
	if (ConfMan.hasKey("dclick_speed"))
		_dclickSpeed = ConfMan.getInt("dclick_speed");

	// HACK/FIXME:
	// We need to clip the volumes from [0, 256] to [0, 255]
	// here, since for example Tinsel's internal options dialog
	// and also the midi playback code rely on the volumes to be
	// in [0, 255]
	_musicVolume = CLIP(ConfMan.getInt("music_volume"), 0, 255);
	_soundVolume = CLIP(ConfMan.getInt("sfx_volume"), 0, 255);
	_voiceVolume = CLIP(ConfMan.getInt("speech_volume"), 0, 255);

	if (ConfMan.hasKey("talkspeed"))
		_textSpeed = (ConfMan.getInt("talkspeed") * 100) / 255;
	if (ConfMan.hasKey("subtitles"))
		_useSubtitles = ConfMan.getBool("subtitles");

	// FIXME: If JAPAN is set, subtitles are forced OFF in the original engine

	//_swapButtons = ConfMan.getBool("swap_buttons") == 1 ? true : false;
	//ConfigData.language = language;	// not necessary, as language has been set in the launcher
	//ConfigData._isAmericanEnglishVersion = _isAmericanEnglishVersion;		// EN_USA / EN_GRB

	// Set language - we'll be clever here and use the ScummVM language setting
	_language = TXT_ENGLISH;
	Common::Language lang = _vm->getLanguage();
	if (lang == Common::UNK_LANG && ConfMan.hasKey("language"))
		lang = Common::parseLanguage(ConfMan.get("language"));	// For multi-lingual versions, fall back to user settings
	switch (lang) {
	case Common::FR_FRA:
		_language = TXT_FRENCH;
		break;
	case Common::DE_DEU:
		_language = TXT_GERMAN;
		break;
	case Common::ES_ESP:
		_language = TXT_SPANISH;
		break;
	case Common::IT_ITA:
		_language = TXT_ITALIAN;
		break;
	case Common::EN_USA:
		_language = TXT_US;
		break;
	default:
		_language = TXT_ENGLISH;
	}

	if (lang == Common::JA_JPN) {
		// TODO: Add support for JAPAN version
	} else if (lang == Common::HE_ISR) {
		// TODO: Add support for HEBREW version

		// The Hebrew version appears to the software as being English
		// but it needs to have subtitles on...
		_language = TXT_ENGLISH;
		_useSubtitles = true;
	} else if (_vm->getFeatures() & GF_USE_3FLAGS) {
		// 3 FLAGS version supports French, German, Spanish
		// Fall back to German if necessary
		if (_language != TXT_FRENCH && _language != TXT_GERMAN && _language != TXT_SPANISH) {
			_language = TXT_GERMAN;
			_useSubtitles = true;
		}
	} else if (_vm->getFeatures() & GF_USE_4FLAGS) {
		// 4 FLAGS version supports French, German, Spanish, Italian
		// Fall back to German if necessary
		if (_language != TXT_FRENCH && _language != TXT_GERMAN &&
				_language != TXT_SPANISH && _language != TXT_ITALIAN) {
			_language = TXT_GERMAN;
			_useSubtitles = true;
		}
	}
}

bool isJapanMode() {
#ifdef JAPAN
	return true;
#else
	return false;
#endif
}

} // End of namespace Tinsel