/*
Copyright (c) OpenGrid project, http://osgrid.org/


* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*     * Redistributions of source code must retain the above copyright
*       notice, this list of conditions and the following disclaimer.
*     * Redistributions in binary form must reproduce the above copyright
*       notice, this list of conditions and the following disclaimer in the
*       documentation and/or other materials provided with the distribution.
*     * Neither the name of the <organization> nor the
*       names of its contributors may be used to endorse or promote products
*       derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using libsecondlife;
using OpenSim.Framework.Utilities;
using OpenSim.Framework.Console;
using OpenSim.Framework.Sims;
using Db4objects.Db4o;

namespace OpenGridServices.GridServer
{
	/// <summary>
	/// </summary>
	public class SimProfileManager {
	
		public Dictionary<LLUUID, SimProfileBase> SimProfiles = new Dictionary<LLUUID, SimProfileBase>();

		public SimProfileManager() {
		}
		
		public void LoadProfiles() {		// should abstract this out
			IObjectContainer db;
			db = Db4oFactory.OpenFile("simprofiles.yap");
                        IObjectSet result = db.Get(typeof(SimProfileBase));
			foreach (SimProfileBase simprof in result) {
				SimProfiles.Add(simprof.UUID, simprof);
			}
			MainConsole.Instance.WriteLine("SimProfiles.Cs:LoadProfiles() - Successfully loaded " + result.Count.ToString() + " from database");
			db.Close();
		}

		public SimProfileBase GetProfileByHandle(ulong reqhandle) {
			foreach (libsecondlife.LLUUID UUID in SimProfiles.Keys) {
				if(SimProfiles[UUID].regionhandle==reqhandle) return SimProfiles[UUID];
			}
			return null;
		}

		public SimProfileBase GetProfileByLLUUID(LLUUID ProfileLLUUID) {
			return SimProfiles[ProfileLLUUID];
		}
	
		public bool AuthenticateSim(LLUUID RegionUUID, uint regionhandle, string simrecvkey) {
			SimProfileBase TheSim=GetProfileByHandle(regionhandle);
			if(TheSim != null) 
			if(TheSim.recvkey==simrecvkey) {
				return true;
			} else {
				return false;
			} else return false;
			
		}

		public string GetXMLNeighbours(ulong reqhandle) {
			string response="";
			SimProfileBase central_region = GetProfileByHandle(reqhandle);
			SimProfileBase neighbour;
			for(int x=-1; x<2; x++) for(int y=-1; y<2; y++) {
				if(GetProfileByHandle(Util.UIntsToLong((uint)((central_region.RegionLocX+x)*256), (uint)(central_region.RegionLocY+y)*256))!=null) {
					neighbour=GetProfileByHandle(Util.UIntsToLong((uint)((central_region.RegionLocX+x)*256), (uint)(central_region.RegionLocY+y)*256));
					response+="<neighbour>";
					response+="<sim_ip>" + neighbour.sim_ip + "</sim_ip>";
					response+="<sim_port>" + neighbour.sim_port.ToString() + "</sim_port>";
					response+="<locx>" + neighbour.RegionLocX.ToString() + "</locx>";
					response+="<locy>" + neighbour.RegionLocY.ToString() + "</locy>";
					response+="<regionhandle>" + neighbour.regionhandle.ToString() + "</regionhandle>";
					response+="</neighbour>";

				}
			}
			return response;
		}

		public SimProfileBase CreateNewProfile(string regionname, string caps_url, string sim_ip, uint sim_port, uint RegionLocX, uint RegionLocY, string sendkey, string recvkey) {
			SimProfileBase newprofile = new SimProfileBase();
			newprofile.regionname=regionname;
			newprofile.sim_ip=sim_ip;
			newprofile.sim_port=sim_port;
			newprofile.RegionLocX=RegionLocX;
			newprofile.RegionLocY=RegionLocY;
			newprofile.caps_url="http://" + sim_ip + ":9000/";
			newprofile.sendkey=sendkey;
			newprofile.recvkey=recvkey;
			newprofile.regionhandle=Util.UIntsToLong((RegionLocX*256), (RegionLocY*256));
			newprofile.UUID=LLUUID.Random();
			this.SimProfiles.Add(newprofile.UUID,newprofile);
			return newprofile;
		}

	}

    /*  is in OpenSim.Framework
	public class SimProfileBase {
		public LLUUID UUID;
		public ulong regionhandle;
		public string regionname;
		public string sim_ip;
		public uint sim_port;
		public string caps_url;
		public uint RegionLocX;
		public uint RegionLocY;
		public string sendkey;
		public string recvkey;
		
	
		public SimProfileBase() {
		}
	
	
	}*/

}