// marquis.cpp
//
// Copyright (C) 2000 Neil Stevens <multivac@fcmail.com>
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
// THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
// AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
// Except as contained in this notice, the name(s) of the author(s) shall not be
// used in advertising or otherwise to promote the sale, use or other dealings
// in this Software without prior written authorization from the author(s).

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <tdeconfig.h>
#include <kdebug.h>
#include <tdemessagebox.h>
#include <tdelocale.h>
#include <noatun/pluginloader.h>
#include "marquis.h"
#include <noatun/player.h>
#include <noatun/engine.h>
#include <tdeaction.h>

static int getPlayStatus( Player *player )
{
	if ( player->isPlaying() )
		return 1;
	if ( player->isPaused() )
		return 2;
	return 0;
}

static void setPlayStatus( Player *player, int status )
{
	switch( status )
	{
		default:
		case 0:
			player->stop();
			break;
		case 1:
			player->play();
			break;
		case 2:
			if ( !player->isPaused() )
			{
				player->play();
				player->playpause();
			}
			break;
	}
}


Marquis::Marquis()
	: TDEMainWindow(0, "Marquis")
	, SessionManagement()
{
	hide();
	kdDebug(66666) << k_funcinfo << "number of members == " << memberList->count() << endl;

// for testing: uncomment this and use
// dcop `dcop | grep noatun` Marquis activateAction dynamicRestore
// and dynamicSave accordingly.
//	(void) new TDEAction("Restore", 0, this, TQT_SLOT( dynamicRestore() ), actionCollection(), "dynamicRestore" );
// 	(void) new TDEAction("Save", 0, this, TQT_SLOT( dynamicSave() ), actionCollection(), "dynamicSave" );
	connect( napp, TQT_SIGNAL( saveYourself() ), TQT_SLOT( dynamicSave() ));
}

Marquis::~Marquis()
{
}

void Marquis::restore(void)
{
	kdDebug(66666) << k_funcinfo << endl;
	dynamicRestore();
}

// unload every window, and save the config as TQStringList of those loaded
void Marquis::saveSessionConfig(TDEConfig *c)
{
	kdDebug(66666) << k_funcinfo << endl;

	Player *player = napp->player();
	c->writeEntry("Volume", player->volume());
	c->writeEntry("Loop Style", player->loopStyle());
	if ( napp->playlist() )
		c->writeEntry("Playlist Visible", napp->playlist()->listVisible());

	if ( !player->current().isNull() )
	{
		KURL songURL = player->current().url();
		songURL.setPass( TQString() ); // don't save passwords
		c->writePathEntry("Current Song", songURL.url());
	}
	else
		c->writePathEntry("Current Song", TQString());

	c->writeEntry("Current Position", player->getTime());
	c->writeEntry("PlayStatus", getPlayStatus( player ));

	// borrowed from Plugin config dialog
	TQStringList specList;

	TQValueList<NoatunLibraryInfo> loaded = napp->libraryLoader()->loaded();
	for( TQValueList<NoatunLibraryInfo>::Iterator i = loaded.begin(); i != loaded.end(); ++i)
	{
		if(!specList.contains((*i).specfile)
		   && napp->libraryLoader()->isLoaded((*i).specfile)
		   && (*i).specfile != "marquis.plugin")
		{
			specList += (*i).specfile;
			napp->libraryLoader()->remove((*i).specfile, false);
		}
	}

	c->writeEntry("Loaded Plugins", specList);
}

// get the list of loaded plugins from the config, and load them
void Marquis::readSessionConfig(TDEConfig *c)
{
	Player *player = napp->player();

	c->setGroup(TQString());

	// First set volume, then load modules, some module could start
	// playback and that would be with 100% volume!
	player->setVolume( c->readNumEntry("Volume", 100) );
	//player->setVolume( 0 );
	player->loop( c->readNumEntry("Loop Style", (int) Player::None) );

	TQStringList list = c->readListEntry("Loaded Plugins");
	/*
	kdDebug(66666) << "Marquis::readSessionConfig()" << endl;
	for(TQStringList::ConstIterator i=list.begin(); i!=list.end(); ++i)
		kdDebug(66666) << *i << endl;
	kdDebug(66666) << "Marquis::readSessionConfig() there we go" << endl;
	*/
	napp->libraryLoader()->loadAll(list);

	if (!napp->playlist())
	{
		KMessageBox::error(0,i18n("No playlist plugin was found. " \
			"Please make sure that Noatun was installed correctly."));
		napp->quit();
		return;
	}

	if ( c->readBoolEntry( "Playlist Visible", false ))
		napp->playlist()->showList();

	napp->player()->engine()->setInitialized();
	// TODO: restore the playback state (also save it ;)
}

void Marquis::dynamicSave()
{
	TDEConfig config( "marquisrc" );
	saveSessionConfig( &config );
}

void Marquis::dynamicRestore()
{
	TDEConfig config( "marquisrc" );
	readSessionConfig( &config );
}

#include "marquis.moc"
