/** 
 * @file llloginhandler.cpp
 * @brief Handles filling in the login panel information from a SLURL
 * such as secondlife:///app/login?first=Bob&last=Dobbs
 *
 * $LicenseInfo:firstyear=2008&license=viewergpl$
 * 
 * Copyright (c) 2008-2009, Linden Research, Inc.
 * 
 * Second Life Viewer Source Code
 * The source code in this file ("Source Code") is provided by Linden Lab
 * to you under the terms of the GNU General Public License, version 2.0
 * ("GPL"), unless you have obtained a separate licensing agreement
 * ("Other License"), formally executed by you and Linden Lab.  Terms of
 * the GPL can be found in doc/GPL-license.txt in this distribution, or
 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
 * 
 * There are special exceptions to the terms and conditions of the GPL as
 * it is applied to this Source Code. View the full text of the exception
 * in the file doc/FLOSS-exception.txt in this software distribution, or
 * online at
 * http://secondlifegrid.net/programs/open_source/licensing/flossexception
 * 
 * By copying, modifying or distributing this software, you acknowledge
 * that you have read and understood your obligations described above,
 * and agree to abide by those obligations.
 * 
 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
 * COMPLETENESS OR PERFORMANCE.
 * $/LicenseInfo$
 */
#include "llviewerprecompiledheaders.h"

#include "llloginhandler.h"

// viewer includes
#include "hippogridmanager.h"
#include "llpanellogin.h"			// save_password_to_disk()
#include "llstartup.h"				// getStartupState()
#include "llurlsimstring.h"
#include "llviewercontrol.h"		// gSavedSettings
#include "llviewernetwork.h"		// EGridInfo

// library includes
#include "llmd5.h"


// Must have instance to auto-register with LLCommandDispatcher
LLLoginHandler gLoginHandler;


//parses the input url and returns true if afterwards
//a web-login-key, firstname and lastname  is set
bool LLLoginHandler::parseDirectLogin(std::string url)
{
	LLURI uri(url);
	parse(uri.queryMap());

	if (mWebLoginKey.isNull() ||
		mFirstName.empty() ||
		mLastName.empty())
	{
		return false;
	}
	else
	{
		return true;
	}
}


void LLLoginHandler::parse(const LLSD& queryMap)
{
	mWebLoginKey = queryMap["web_login_key"].asUUID();
	mFirstName = queryMap["first_name"].asString();
	mLastName = queryMap["last_name"].asString();
	
	// Deprecated in favor of the new grid manager - MC
	/*EGridInfo grid_choice = GRID_INFO_NONE;
	if (queryMap["grid"].asString() == "sl beta grid")
	{
		grid_choice = GRID_INFO_ADITI;
	}
	else if (queryMap["grid"].asString() == "sl main grid")
	{
		grid_choice = GRID_INFO_AGNI;
	}

	if(grid_choice != GRID_INFO_NONE)
	{
		LLViewerLogin::getInstance()->setGridChoice(grid_choice);
	}*/

	std::string startLocation = queryMap["location"].asString();

	if (startLocation == "specify")
	{
		LLURLSimString::setString(queryMap["region"].asString());
	}
	else if (startLocation == "home")
	{
		gSavedSettings.setBOOL("LoginLastLocation", FALSE);
		LLURLSimString::setString(LLStringUtil::null);
	}
	else if (startLocation == "last")
	{
		gSavedSettings.setBOOL("LoginLastLocation", TRUE);
		LLURLSimString::setString(LLStringUtil::null);
	}
}

bool LLLoginHandler::handle(const LLSD& tokens,
							const LLSD& query_map,
							LLMediaCtrl* web)
{	
	parse(query_map);
	
	//if we haven't initialized stuff yet, this is 
	//coming in from the GURL handler, just parse
	if (STATE_FIRST == LLStartUp::getStartupState())
	{
		return true;
	}
	
	std::string password = query_map["password"].asString();

	if (!password.empty())
	{
		gSavedSettings.setBOOL("RememberPassword", TRUE);

		if (password.substr(0,3) != "$1$")
		{
			// grids we try in order: loginhandler "grid", LastConnectedGrid, grid manager
			// icky that we do this here and in LLStartUp
			std::string grid_nick = query_map["grid"].asString();
			if (grid_nick.empty()) grid_nick = gSavedSettings.getString("LastConnectedGrid");
			if (grid_nick.empty()) grid_nick = gHippoGridManager->getCurrentGridNick();
			HippoGridInfo* grid = gHippoGridManager->getGrid(grid_nick);
			if (grid) grid->setPassword(password);
		}
	}
			

	if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP)  //on splash page
	{
		LLPanelLogin::loadLoginForm();

		if (!mFirstName.empty() || !mLastName.empty())
		{
			// Fill in the name, and the password if we can
			if (password.empty())
			{
				password = gHippoGridManager->getCurrentGrid()->getPassword();
			}

			if (gHippoGridManager && gHippoGridManager->getCurrentGrid()->isUsernameCompat())
			{
				if (mLastName == "resident" || mLastName == "Resident")
				{
					LLPanelLogin::setFields(mFirstName, password);
				}
				else
				{
					LLPanelLogin::setFields(mFirstName+"."+ mLastName, password);
				}
			}
			else
			{
				LLPanelLogin::setFields(mFirstName, mLastName, password);
			}
		}

		if (mWebLoginKey.isNull())
		{
			LLPanelLogin::loadLoginPage();
		}
		else
		{
			LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
		}
	}
	return true;
}