

import Crossfire,sys,datetime
whoami=Crossfire.WhoAmI()
activator=Crossfire.WhoIsActivator()
import CFDataBase,CFBank
#for i in dir(CFDataBase):
	#print i
#print CFDataBase.__file__

CFDB=CFDataBase.CFDataBase("PShop")
PicDB=CFDataBase.CFDataBase("PicDB")
PicDict=PicDB.get("Dict")
bank=CFBank.CFBank("ImperialBank_DB")
pshop=whoami.Map.Path.replace("/","_")


#print CFDB.get(pshop)
#print pshop



activator=Crossfire.WhoIsActivator()


def Expire():
	global Owner

	Inventory=mymap.ObjectAt(43,2)
	MailMap=Crossfire.ReadyMap("/planes/IPO_storage")
	while Inventory!=None:
		if Inventory.Name!="Vault":
			package=whoami.CreateObject("package")
			package.Name="IPO-package F: Your-Private-Shop T: "+Owner
			Inventory.InsertInto(package)
			package.Teleport(MailMap,2,2)

		Inventory=Inventory.Above
	Inventory=mymap.ObjectAt(43,2)
	while Inventory!=None:
		if Inventory.Name!="Vault":
			package=whoami.CreateObject("package")
			package.Name="IPO-package F: Your-Private-Shop T: "+Owner
			Inventory.InsertInto(package)
			package.Teleport(MailMap,2,2)

		Inventory=Inventory.Below

	Dict=CFDB.get(pshop, {})

	for i in Dict:
		This=Dict.get(i)
		if This[1]!="PickedUp":
			That=mymap.ObjectAt(This[1][0],This[1][1])
			if That!=None:
				That=GetObjectByWeightLimit(That,int(i))
				if That!=0:
					That.Teleport(whoami.Map,37,0)

	CFDB.store(pshop,{})
	Owner="Unowned"
	Chest=mymap.ObjectAt(30,8)
	Chest=GetObjectByName(Chest, "Rent Box")
	if Chest!=0:
		Chest.Teleport(mymap, 15,10)
	for i in range(0,34):
		for a in range(0,35):
			for obj in [GetObjectAt(whoami.Map,i,a,'NoBuild'),
						GetObjectAt(whoami.Map,i,a,'NoSpell')]:
				if obj:
					obj.Remove()

	for obj in [GetObjectAt(whoami.Map,30,5,"Brazier material"),
				GetObjectAt(whoami.Map,30,6,"Firepot material"),
				GetObjectAt(whoami.Map,30,7,"Bright Firepot Material"),
				GetObjectAt(whoami.Map,29,8,"Red CWall material")]:
		if obj:
			obj.Remove()


	for pos_from, pos_to in [((49, 5), (30, 5)),
						     ((49, 4), (30, 6)),
						     ((49, 6), (30, 7)),
						     ((49, 7), (29, 8))]:
	   obj = whoami.Map.ObjectAt(*pos_from)

	   if obj:
		   obj.Teleport(whoami.Map, *pos_to)
def GetObjectByName(object, Name):
	while object.Name!=Name:
		object=object.Above
		if not object:
			return 0
	return object
def GetObjectAt(Map,X,Y,Name):
    Object=Map.ObjectAt(X,Y)
    while Object!=None:
        if Object.Name==Name:
            return Object
        else:
            Object=Object.Above
    return Object
def GetObjectByWeightLimit(object, WeightLimit):
	while object.WeightLimit!=WeightLimit:
		object=object.Above
		if not object:
			return 0
	return object
def GetObjectByUID(object, UID):
	while object.Name.split()[0]!=UID:
		object=object.Above
		if not object:
			return 0
	return object
def GetInvCount(object):
	Inv=object.Inventory
	Counter=-1
	while Inv!=None:
		Counter+=1
		Inv=Inv.Below
	return Counter
mymap=whoami.Map
CoinTypes={"SILVER":1,"GOLD":10,"PLATINUM":50,"JADE":5000,"AMBER":500000,"IMPERIAL":10000}
Params=Crossfire.ScriptParameters()
if whoami.Name.find("Store")>-1:


	InvCount=GetInvCount(whoami)
	if InvCount==0:
		whoami.Say("Useage: Put an item in me and name a price.  For details, ask for 'help'.")

	else:
		Message=Crossfire.WhatIsMessage()
		Message=Message.split()
		Value=0
		for i in range(len(Message)):
			CoinType=CoinTypes.get(Message[i].upper())
			if CoinType!=None:
				Quantity=int(Message[i-1])
				Value+=Quantity*CoinType
		Package=whoami.CreateObject("dust_generic")
		Package.Face="package.111"
		Package.Teleport(whoami.Map,43,2)

		for i in range(InvCount):
			Item=whoami.Inventory
			Item.InsertInto(Package)

		Package.Name=str(whoami.Value)+" "+str(Value)
		Package.Speed=whoami.Value
		Package.WeightLimit=0
		z=Package.CreateObject("event_pickup")
		z.Name="Pickup"
		z.Title="Python"
		z.Slaying="/python/pshop/pshop.py"




		#STRING=STRING.split("Items: ")[1]

		if Item.Name==Crossfire.ScriptParameters():
			Item=Item.Below



		GlassReplica=whoami.CreateObject("icecube")
		GlassReplica.WeightLimit=whoami.Value
		GlassReplica.Weight=max(Item.Weight*Item.Quantity,1)
		GlassReplica.Quantity=1
		t=GlassReplica.CreateObject("event_drop")
		t.Name="Drop"
		t.Value=whoami.Value
		t.Title="Python"
		t.Slaying="/python/pshop/Ice.py"
		t=GlassReplica.CreateObject("event_pickup")
		t.Name="Get"
		t.Title="Python"
		t.Slaying="/python/pshop/Ice.py"
		t=GlassReplica.CreateObject("event_destroy")
		t.Name="Destroy"
		t.Title="Python"
		t.Slaying="/python/pshop/Ice.py"
		t=GlassReplica.CreateObject("event_time")
		t.Name="Timer"
		t.Title="Python"
		t.Slaying="/python/pshop/Ice.py"
		GlassReplica.Speed=0.0010000000475

		GlassReplica.Face=(str(Item.Face))
		#GlassReplica.Material=(96,'ice')

		GlassReplica.Name=str(Item.Quantity)+" "+Item.Name+" Price: "+str(Value)
		GlassReplica.NamePl="0"


		Message="Name: "+str(Item.Name)
		Message+="\nTitle: "+str(Item.Title)
		#Message+="\nMaterial: "+str(Item.Material.get("MaterialName"))
		Message+="\nQuantity: "+str(Item.Quantity)
		if Item.Cursed==1:
			Message+="\nCursed: True"
		Message+="\nWeight: "+str(Item.Weight)

		if Item.Dam!=0:
			Message+="\nDam: "+str(Item.Dam)
		if Item.AC!=0:
			Message+="\nAC: "+str(Item.AC)
		if Item.WC!=0:
			Message+="\nWC: "+str(Item.WC)
		if Item.Wis!=0:
			Message+="\nWis: "+str(Item.Wis)
		if Item.Str!=0:
			Message+="\nStr: "+str(Item.Str)

		if Item.Pow!=0:
			Message+="\nPow: "+str(Item.Pow)
		if Item.Int!=0:
			Message+="\nInt: "+str(Item.Int)
		if Item.Dex!=0:
			Message+="\nDex: "+str(Item.Dex)
		if Item.Con!=0:
			Message+="\nCon: "+str(Item.Con)
		if Item.Cha!=0:
			Message+="\nCha: "+str(Item.Cha)
		if Item.Value!=0:
			Message+="\nValue: "+str(Item.Value)
		GlassReplica.Message=Message
		Dict=CFDB.get(pshop, {})
		Dict.update({str(whoami.Value):(Value,"PickedUp",Message)})


		CFDB.store(pshop,Dict)

		whoami.Value+=1
elif whoami.Name.find("Rent Box")>-1:
	Value=0
	Inventory=whoami.Inventory

	while Inventory!=None:

		if Inventory.ArchName=="event_close":
			Inventory=Inventory.Below
		else:
			Value+=Inventory.Value*Inventory.Quantity

			Inventory.Teleport(whoami.Map,37,5)
			Inventory=whoami.Inventory
	Variables=whoami.Map.ObjectAt(49,0)
	Variables=GetObjectByName(Variables,"Variables")
	VariableList= Variables.Message.split('\n')
	Owner=VariableList[0].split(": ")[1]
	Date=VariableList[1].split(": ")[1]
	Days=int(VariableList[2].split(": ")[1])



	Year, Month, Day=Date.split("-")
	LastDate=datetime.datetime(int(Year),int(Month),int(Day))
	Today=datetime.date(1,2,3).today()
	Today=datetime.datetime(Today.year, Today.month, Today.day)
	DaysPast=(Today-LastDate).days
	Days-=DaysPast
	MaxDays=int(Params)
	if Owner!="Unowned":
		if Days<30:
			DT30=30-Days
			if DT30<=Value/50:
				Value-=DT30*50
				Days=30
			else:
				Days+=int(Value/50)
				Value-=int(Value/50)*50



		if Value>=100:
			if Days<60:
				DT60=60-Days
				if DT60<=Value/100:
					Value-=DT60*100
					Days=60
				else:
					Days+=int(Value/100)
					Value-=int(Value/100)*100

		if Value>=200:
			if Days<90:
				DT90=90-Days
				if DT90<=Value/200:
					Value-=DT90*200
					Days=90
				else:
					Days+=int(Value/200)
					Value-=int(Value/200)*200
		if Value>=400:
			if Days<120:
				DT120=120-Days
				if DT120<=Value/400:
					Value-=DT120*400
					Days=120
				else:
					Days+=int(Value/400)
					Value-=int(Value/400)*400
		if Value>=800:
			if Days<150:
				DT150=150-Days
				if DT150<=Value/800:
					Value-=DT150*800
					Days=150
				else:
					Days+=int(Value/800)
					Value-=int(Value/800)*800
		if Value>=1600:
			if Days<180:
				DT180=180-Days
				if DT90<=Value/1600:
					Value-=DT180*1600
					Days=180
				else:
					Days+=int(Value/1600)
					Value-=int(Value/1600)*1600
		if Value>=3200:
			if Days<210:
				DT210=210-Days
				if DT210<=Value/3200:
					Value-=DT210*3200
					Days=210
				else:
					Days+=int(Value/3200)
					Value-=int(Value/3200)*3200
		if Value>=6400:
			if Days<240:
				DT240=240-Days
				if DT240<=Value/6400:
					Value-=DT240*6400
					Days=240
				else:
					Days+=int(Value/6400)
					Value-=int(Value/6400)*6400
		if Value>=12800:
			if Days<270:
				DT270=270-Days
				if DT270<=Value/12800:
					Value-=DT270*12800
					Days=270
				else:
					Days+=int(Value/12800)
					Value-=int(Value/12800)*12800
		if Value>=25600:
			if Days<300:
				DT300=300-Days
				if DT300<=Value/25600:
					Value-=DT300*25600
					Days=300
				else:
					Days+=int(Value/25600)
					Value-=int(Value/25600)*25600

		if Value>=51200:
			if Days<330:
				DT330=330-Days
				if DT330<=Value/51200:
					Value-=DT330*51200
					Days=330
				else:
					Days+=int(Value/51200)
					Value-=int(Value/51200)*51200
		if Value>=102400:
			if Days<366:
				DT366=366-Days
				if DT366<=Value/102400:
					Value-=DT366*102400
					Days=366
				else:
					Days+=int(Value/102400)
					Value-=int(Value/102400)*102400
		tmp=whoami.CreateObject("silvercoin")
		tmp.Quantity=Value
		Days=min(Days,MaxDays)
	else:
		DT30=30
		Owner=activator.Name
		if DT30<=Value/50:
			Value-=DT30*50
			Days=30
		else:
			Days+=int(Value/50)
			Value-=int(Value/50)
		if Value>0:
			tmp=whoami.CreateObject("silvercoin")
			tmp.Quantity=Value
	if Days>=1:
		whoami.Teleport(whoami.Map,30,8)
	else:
		whoami.Teleport(whoami.Map,15,10)
	Variables.Message="Owner: "+Owner+"\nDate: "+str(Today.year)+"-"+str(Today.month)+"-"+str(Today.day)+"\nDays: "+str(Days)
elif Params=="Trade":
	Message=Crossfire.WhatIsMessage().split()
	if Message[0].upper()=='TRADE':
		Name=''
		Title=''
		Quantity=0
		for i in range(len(Message)):

			if Message[i].upper()=="NAME":
				Name=Message[i+1]
			elif Message[i].upper()=='TITLE':
				Title=Message[i+1]
			elif Message[i].upper()=='QUANTITY':
				Quantity=int(Message[i+1])
elif Params=="Exchange":
	pass
elif Params=="InventorySay":

	Message=Crossfire.WhatIsMessage().split()
	if Message[0]=="Remove":

		CFDB.remove_record(pshop)
	if Message[0].upper().find("DETAIL")>-1:
		Item=' '.join(Message[1:])

		Dict=CFDB.get(pshop, {})

		Ctrl=1
		for i in Dict:
			Str=Dict.get(str(i))
			Name=Str[2].split('\n')[0].split("Name: ")[1]

			if Item==Name:

				Message="\n"+str(Dict.get(i)[2])

				Message+=("\nAsking Price: "+str(Dict.get(i)[0])+"\nLocation: ")

				if Dict.get(i)[1]=="PickedUp":

					Message+="Not on store floor"

				elif Dict.get(i)[1][1]<=9:
					Message+="In employee only area."
				else:
					Message+=str(Dict.get(i)[1])
					Message+="\n(You are at ("+str(whoami.X)+","+str(whoami.Y)+")."
				whoami.Say(Message)
				Ctrl=0
		if Ctrl==1:


			Item=int(Message[1])


			Item=list(Dict)[Item-1]

			Item=Dict.get(str(Item))[2].split('\n')[0].split('Name: ')[1]

			for i in Dict:
				Str=Dict.get(str(i))
				Name=Str[2].split('\n')[0].split("Name: ")[1]

				if Item==Name:

					Message="\n"+str(Dict.get(i)[2])

					Message+=("\nAsking Price: "+str(Dict.get(i)[0])+"\nLocation: ")

					if Dict.get(i)[1]=="PickedUp":

						Message+="Not on store floor"

					elif Dict.get(i)[1][1]<=9:
						Message+="In employee only area."
					else:
						Message+=str(Dict.get(i)[1])
						Message+="\n(You are at ("+str(whoami.X)+","+str(whoami.Y)+")."
					whoami.Say(Message)
					Ctrl=0
elif Params=="AutoCheckout":
	Dict=CFDB.get(pshop, {})
	Inv=activator.Inventory
	Items=[]
	RealItems=[]
	MissingItems=[]
	Price=0

	while Inv!=None:

		if (Inv.Name.find("Price: ")>-1):

			Items=Items.__add__([Inv])

		Inv=Inv.Below
	for i in Items:
		Item=(activator.Map.ObjectAt(43,2))



		Item=GetObjectByUID(Item,str(i.WeightLimit))

		if Item!=0:

			Price+=int(Item.Name.split()[1])
			RealItems=RealItems.__add__([Item])
		else:

			whoami.Say("Item "+i.Name+" missing.")
			MissingItems=MissingItems.__add__([i])
	if activator.PayAmount(Price):
		for i in RealItems:
			i.InsertInto(activator)
			tmp=Dict.pop((str(i.Name.split()[0])))
		for i in Items:
			i.Teleport(activator.Map, 37,0)
			i.Speed+=(0.00010000000475*2)

		for i in MissingItems:
			i.Teleport(activator.Map,37,0)
			i.Speed+=(0.00010000000475*2)
			tmp=Dict.pop((str(i.WeightLimit)))


		CFDB.store(pshop,Dict)

		Variables=GetObjectByName(mymap.ObjectAt(49,0),"Variables")



		VariableList= Variables.Message.split('\n')
		Owner=VariableList[0]
		Date=VariableList[1]
		Days=VariableList[2]

		Owner=Owner.split(": ")[1]
		Date=Date.split(": ")[1]

		Days=int(Days.split(": ")[1])

		Year, Month, Day=Date.split("-")
		LastDate=datetime.datetime(int(Year),int(Month),int(Day))
		Today=datetime.date(1,2,3).today()
		Today=datetime.datetime(Today.year, Today.month, Today.day)
		DaysPast=(Today-LastDate).days
		Days-=DaysPast

		if Days<30:
			DT30=30-Days
			if DT30<=Price/50:
				Price-=DT30*50
				Days=30
			else:
				Days+=int(Price/50)
				Price-=int(Price/50)

		if Days<=0:
			global Owner


			Expire()

		Variables.Message="Owner: "+Owner+"\nDate: "+str(Today.year)+"-"+str(Today.month)+"-"+str(Today.day)+"\nDays: "+str(Days)
		bank.deposit(Owner, int(Price/1.01))

	else:
		whoami.Say("You do not have enough cash, "+str(Price)+" silver needed.")
elif Params=="BankCheckout":
	Dict=CFDB.get(pshop, {})
	Inv=activator.Inventory
	Items=[]
	RealItems=[]
	MissingItems=[]
	Price=0

	while Inv!=None:
		if (Inv.Name.find("Price: ")>-1):

			Items=Items.__add__([Inv])

		Inv=Inv.Below

	for i in Items:
		Item=(activator.Map.ObjectAt(43,2))



		Item=GetObjectByUID(Item,str(i.WeightLimit))

		if Item!=0:

			Price+=int(Item.Name.split()[1])
			RealItems=RealItems.__add__([Item])
		else:

			whoami.Say("Item "+i.Name+" missing.")
			MissingItems=MissingItems.__add__([i])
	if bank.getbalance(activator.Name)>=Price:
		bank.withdraw(activator.Name, Price)
		for i in RealItems:
			i.InsertInto(activator)
			tmp=Dict.pop((str(i.Name.split()[0])))
		for i in Items:
			i.Teleport(activator.Map, 37,0)
			i.Speed+=(0.00010000000475*2)

		for i in MissingItems:
			i.Teleport(activator.Map,37,0)
			i.Speed+=(0.00010000000475*2)
			tmp=Dict.pop((str(i.WeightLimit)))


		CFDB.store(pshop,Dict)

		Variables=GetObjectByName(mymap.ObjectAt(49,0),"Variables")



		VariableList= Variables.Message.split('\n')
		Owner=VariableList[0]
		Date=VariableList[1]
		Days=VariableList[2]

		Owner=Owner.split(": ")[1]
		Date=Date.split(": ")[1]

		Days=int(Days.split(": ")[1])

		Year, Month, Day=Date.split("-")
		LastDate=datetime.datetime(int(Year),int(Month),int(Day))
		Today=datetime.date(1,2,3).today()
		Today=datetime.datetime(Today.year, Today.month, Today.day)
		DaysPast=(Today-LastDate).days
		Days-=DaysPast

		if Days<30:
			DT30=30-Days
			if DT30<=Price/50:
				Price-=DT30*50
				Days=30
			else:
				Days+=int(Price/50)
				Price-=int(Price/50)

		if Days<=0:
			global Owner


			Expire()

		Variables.Message="Owner: "+Owner+"\nDate: "+str(Today.year)+"-"+str(Today.month)+"-"+str(Today.day)+"\nDays: "+str(Days)
		bank.deposit(Owner, int(Price/1.01))

	else:
		whoami.Say("You do not have enough funds in the bank. "+str(Price)+" needed.")
elif Params=="TrashOpen":
	Trash=whoami.Map.ObjectAt(37,0)
	while Trash!=None:
		Trash1=Trash.Above
		Trash.InsertInto(whoami)
		Trash=Trash1
elif Params=="TrashClose":
	Trash=whoami.Inventory
	while Trash!=None:
		if (Trash.Name=="TrashClose") or (Trash.Name=="TrashOpen"):
			Trash=Trash.Above
		else:
			Trash.Teleport(whoami.Map,37,0)

			if Trash.ArchName=="icecube":
				Trash.Speed+=(0.00010000000475*2)
			Trash=whoami.Inventory

else:
	whoami.Message="xyzzy"
	Dict=CFDB.get(pshop, {})
	whoami.Message=''
	for i in Dict:
		Str=Dict.get(i)[2].split('\n')[0]

		whoami.Message+=str(Str)
