import pygame
from pygame.locals import *
from elements import *
import time


BACKGROUND = (0,0,0)
BRUSHSIZE = 3

running = True
width = 200
height = 200

size = (width, height)
PIXELSIZE = 2
screensize = (PIXELSIZE*width, PIXELSIZE*height)
screen = pygame.display.set_mode(screensize)
clock = pygame.time.Clock()

grid = [[None for y in xrange(height+2)] for x in xrange(width+2)]
grid[0] = [BOUNDARY]*(height+1)
grid[width] = [BOUNDARY]*(height+1)
for g in grid:
	g[4] = BOUNDARY
	g[-4] = BOUNDARY

active_elements = []

w = Water(20,20,grid,active_elements)
active_elements.append(w)
grid[20][20] = w

running = True


def getnear(x,y):
	global grid

mousepressed = False
paintelement = Water
time1s = []
time2s = []
def av(l):
	return sum(l)/len(l)

while running:
	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			running = False
		elif event.type == pygame.MOUSEBUTTONDOWN:
			mousepressed = True
		elif event.type == pygame.MOUSEBUTTONUP:
			mousepressed = False
		elif event.type == pygame.KEYDOWN:
			if event.key == K_0:
				paintelement = None
			elif event.key == K_1:
				paintelement = Water
			elif event.key == K_2:
				paintelement = Wall
			elif event.key == K_3:
				paintelement = Fire
			elif event.key == K_4:
				paintelement = Oil
			elif event.key == K_KP_PLUS:
				BRUSHSIZE += 1
			elif event.key == K_KP_MINUS:
				BRUSHSIZE -= 1

	time1 = time.time()
	map(lambda x:x.act(), active_elements)

	#for element in active_elements:
		#element.act()

	time1 = time.time() - time1
	time1s.append(time1)
	time1 = av(time1s)

	time2 = time.time()


	time2 = time.time() - time2
	time2s.append(time2)
	time2 = av(time2s)

	for item in toremove:
		toremove.remove(item)
		del(item)

	if mousepressed:
		x0,y0 = pygame.mouse.get_pos()
		x0 = x0/2
		y0 = y0/2
		for xs in xrange(BRUSHSIZE):
			for ys in xrange(BRUSHSIZE):
				if paintelement is None:
					x = x0 + xs
					y = y0 + ys
					item = grid[x][y]
					if item is not None:
						item.remove()
						#if item in active_elements:
							#active_elements.remove(grid[x][y])
							#grid[x][y] = None
				else:
					x = x0 + xs
					y = y0 + ys
					if grid[x][y] == None:
						e = paintelement(x,y,grid,active_elements)
						e.register()
						#active_elements.append(e)
						#grid[x][y] = e


	'''
	screen.fill(BACKGROUND)
	for x in grid:
		for element in x:
			if element is not None:
				for x in xrange(PIXELSIZE):
					for y in xrange(PIXELSIZE):
						screen.set_at((PIXELSIZE*element.x+x,PIXELSIZE*element.y+y),element.color())
	'''
	print '\r',len(changed), len(changedempty),

	for pos in changedempty:
		x0 = pos[0]
		y0 = pos[1]
		for x in xrange(PIXELSIZE):
			for y in xrange(PIXELSIZE):
				screen.set_at((PIXELSIZE*x0+x,PIXELSIZE*y0+y),BACKGROUND)

	changedempty[:] = []

	for pos in changed:
		x0 = pos[0]
		y0 = pos[1]
		if grid[x0][y0] is None:
			continue
		for x in xrange(PIXELSIZE):
			for y in xrange(PIXELSIZE):
				screen.set_at((PIXELSIZE*x0+x,PIXELSIZE*y0+y),grid[x0][y0].color())

	changed[:] = []



	clock.tick(50)
	pygame.display.flip()

	

