#importing
import pygame
import neat
import time
import os
import random
pygame.font.init()

#setting window
WINDOW_HEIGHT = 800
WINDOW_WIDTH = 500

#storing bird images

BIRD_IMG = [pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird1.png"))), pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird2.png"))), pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird3.png")))] 
#pygame.transform.scale2x = doubling the size of the bird
PIPE_IMG = pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "pipe.png")))
BASE_IMG = pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "base.png")))
BG_IMG = pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bg.png")))

STAT_FONT = pygame.font.SysFont("comicsans", 45)

class Bird:
	IMGS = BIRD_IMG
	MAX_ROTATION = 25 #Degree
	ROT_VEL = 20 #Each frame rotate
	ANIM_TIME = 5 #how fast bird will be flipping it's pakha

	def __init__(self, x, y):
		self.x = x
		self.y = y
		self.tilt = 0
		self.tick_c = 0 #tick count
		self.vel = 0
		self.height = self.y #
		self.img_count = 0 #which image is showing
		self.img = self.IMGS[0]

	def jump(self):
		self.vel = -10.5 # minus because getting up is minus according to the pic because it starts with 0,0 from left-up
		self.tick_count = 0 #when we last jumped
		self.height = self.y

	def move(self):
		self.tick_count += 1

		d = self.vel*self.tick_count + 1.5*self.tick_count**2

		if d >= 16:
			d = 16

		if d < 0:
			d -= 2

		self.y = self.y + d

		if d < 0 or self.y < self.height + 50:
			if self.tilt < self.MAX_ROTATION:
				self.tilt = self.MAX_ROTATION
		else:
			if self.tilt > -90:
				self.tilt -= self.ROT_VEL

	def draw(self, win):
		self.img_count += 1

		if self.img_count < self.ANIM_TIME:
			self.img = self.IMGS[0]
		elif self.img_count < self.ANIM_TIME * 2:
			self.img = self.IMGS[1]
		elif self.img_count < self.ANIM_TIME * 3:
			self.img = self.IMGS[2]
		elif self.img_count < self.ANIM_TIME * 4:
			self.img = self.IMGS[1]
		elif self.img_count < self.ANIM_TIME * 4 + 1:
			self.img = self.IMGS[0]
			self.img_count = 0

		if self.tilt <= -80:
			self.img = self.IMGS[1]
			self.img_count = self.ANIM_TIME*2

		rotated_img = pygame.transform.rotate(self.img, self.tilt)
		new_rectangle = rotated_img.get_rect(center=self.img.get_rect(topleft = (self.x, self.y)).center)
		win.blit(rotated_img, new_rectangle.topleft)

	def get_mask(self):
		return pygame.mask.from_surface(self.img)

class Pipe:
	GAP = 200 # space in between a pipe
	VEL = 5

	def __init__(self, x):
		self.x = x
		self.height = 0
		self.gap = 100

		self.top = 0 
		self.bottom = 0
		self.PIPE_TOP = pygame.transform.flip(PIPE_IMG, False, True)
		self.PIPE_BOTTOM = PIPE_IMG

		self.passed = False
		self.set_height()

	def set_height(self):
		self.height = random.randrange(50, 450)
		self.top = self.height - self.PIPE_TOP.get_height()
		self.bottom = self.height + self.GAP

	def move(self):
		self.x -= self.VEL

	def draw(self, win):
		win.blit(self.PIPE_TOP, (self.x, self.top))
		win.blit(self.PIPE_BOTTOM, (self.x, self.bottom))

	def collide(self, bird):
		bird_mask = bird.get_mask()
		top_mask = pygame.mask.from_surface(self.PIPE_TOP)
		bottom_mask = pygame.mask.from_surface(self.PIPE_BOTTOM)
		#offset
		top_offset = (self.x - bird.x, self.top - round(bird.y)) #didn't understand
		bottom_offset = (self.x - bird.x, self.bottom - round(bird.y))

		b_point = bird_mask.overlap(bottom_mask, bottom_offset) #the point of collision/overlap
		t_point = bird_mask.overlap(top_mask, top_offset)

		if t_point or b_point:
			return True #Colliding

		return False #Not Colliding

class Base:
	VEL = 5
	WIDTH = BASE_IMG.get_width()
	IMG = BASE_IMG

	def __init__(self, y):
		self.y = y
		self.x1 =0
		self.x2 = self.WIDTH

	def move(self):
		self.x1 -= self.VEL
		self.x2 -= self.VEL

		if self.x1 + self.WIDTH < 0:
			self.x1 = self.x2 + self.WIDTH

		if self.x2 + self.WIDTH < 0:
			self.x2 = self.x1 + self.WIDTH

	def draw(self, win):
		win.blit(self.IMG, (self.x1, self.y))
		win.blit(self.IMG, (self.x2, self.y))


def draw_window (win, bird, pipes, base, score):
	win.blit(BG_IMG, (0,0)) #draw

	for pipe in pipes:
		pipe.draw(win)

	text = STAT_FONT.render("Score: " + str(score), 1, (255, 255, 255))
	win.blit(text, (WINDOW_WIDTH - 10 - text.get_width(), 10))

	base.draw(win)	

	bird.draw(win)
	pygame.display.update()


def main():

	score = 0

	bird = Bird(230, 350)
	base = Base(730)
	pipes = [Pipe(600)]
	win = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
	clock = pygame.time.Clock() #for the ticks

	run = True
	while run:
		clock.tick(60) #30 ticks per sec. 1 tick = 1fps, 30 = 30fps
		for event in pygame.event.get():
			if event.type == pygame.QUIT:
				run = False

		add_pipe = False
		rem = [] #removed pipe
		for pipe in pipes:
			if pipe.collide(bird):
				pass

			if pipe.x + pipe.PIPE_TOP.get_width() < 0:
				rem.append(pipe)

			if not pipe.passed and pipe.x < bird.x:
				pipe.passed = True
				add_pipe = True

			pipe.move()

		if add_pipe:
			score += 1
			pipes.append(Pipe(600))

		for r in rem: #r = random
			pipes.remove(r)

		if bird.y + bird.img.get_height() >= 730:
			pass

		base.move()
		draw_window(win, bird, pipes, base, score)
		
	pygame.quit()
	quit()

main()


#while True: #30 fps
	#bird.move()
