import random #for generating ramdom number
import sys    #To Exit the program
import pygame
from pygame.locals import * #Basic pygame import.

#Golbal Variable for the game
FPS = 32   #frame per second
SCREENWIDTH = 289
SCREENHEIGHT = 511
SCREEN = pygame.display.set_mode((SCREENWIDTH,SCREENHEIGHT)) #Initialize a window or screen for display
GROUNDY = SCREENHEIGHT * 0.8
GAME_SPRITES = {}
GAME_SOUNDS = {}
PLAYER = 'gallery/sprites/bird.png'
BACKGROUND = 'gallery/sprites/background.png'
PIPE = 'gallery/sprites/pipe.png'

def welcomScreen():
    """
        Shows welcomed images on the screen
    """
    playerx = int(SCREENWIDTH/5)
    playery= int(SCREENHEIGHT - GAME_SPRITES['player'].get_height())/2
    messagex= int(SCREENWIDTH -GAME_SPRITES['message'].get_width())/2
    messagey= int(SCREENHEIGHT*0.13)
    basex =0
    while True:
        for event in pygame.event.get():
            # if user clicks on cross button , close the game
            if event.type == QUIT or (event.type==KEYDOWN and event.key== K_ESCAPE):
                pygame.quit()
                sys.exit()
            elif event.type==KEYDOWN and (event.key==K_SPACE or event,key == K_UP):
                return
            else:
                SCREEN.blit(GAME_SPRITES['background'],(0,0))
                SCREEN.blit(GAME_SPRITES['player'],(playerx,playery))  
                SCREEN.blit(GAME_SPRITES['message'],(messagex,messagey))  
                SCREEN.blit(GAME_SPRITES['base'],(basex,GROUNDY))  
                pygame.display.update()
                FPSCLOCK.tick(FPS)   
def mainGame():
    score=0
    playerx=int(SCREENWIDTH/5)
    playery = int(SCREENHEIGHT/2)
    basex = 0
    #Create 2 pipes for blitting on the screen
    newPipe1 = getRandomPipe()
    newPipe2 = getRandomPipe()
    #my List of upper pipes
    upperPipes = [
        {'x': SCREENWIDTH + 200,'y':newPipe1[0]['y']},
        {'x': SCREENWIDTH + 200 +(SCREENWIDTH/2),'y': newPipe2[1]['y']}
    ]
     #my List of Lower pipes
    lowerPipes = [
        {'x': SCREENWIDTH + 200,'y':newPipe1[0]['y']},
        {'x': SCREENWIDTH + 200 +(SCREENWIDTH/2),'y': newPipe2[1]['y']}
    ]
    pipeVelX = -4
    playerVelY = -9
    playerMaxVelY = 10
    playerMinVelY = -8
    palyerAccY = 1
    playerFlapAccv = -8 # velocity while flapping
    playerFlapped = Flase # It is true only when the bird is flapping

    while True:
        for event in pygame.event.get():
            if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN and (event.key == K_SPACE or event.key == K_UP):
                if playery > 0:
                    playerVelY = playerFlapAccv
                    playerFlapped = True
                    GAME_SOUNDS['wing'].play()
        crashTest = isCollide(playerx,playery,upperPipes,lowerPipes) # this functiom check collidal state              
        if crashTest:
            return
        # check for score
        playerMidPos = playerx + GAME_SPRITES['player'].get_width()/2
        for pipe in upperPipes:
            pipeMidPos = pipe['x'] + GAME_SPRITES['pipe'][0].get_width()/2
            if pipeMidPos <= playerMidPos < pipeMidPos +4:
                score +=1
                print('your score is {score}')   
            GAME_SOUNDS['point'].play()
        if playerVelY < playerMaxVelY and not playerFlapped:
            playerVelY += palyerAccY
        if playerFlapped:
            playerFlapped = False
        playerHeight = GAME_SPRITES['player'].get_height()
        playery = playery + min(playerVelY, GROUNDY - playery - playerHeight) 

        # move pipes to the left
        for upperPipe , lowerPipe in zip(upperPipes, lowerPipes):
            upperPipe['x'] += pipeVelX
            lowerPipe['x']+= pipeVelX
        # Add a new pipe when one left the screen 
        if 0 < upperPipes[0]['x'] <5:
            newpipe = getRandomPipe()
            upperPipes.append(newpipe[0])
            lowerPipes.append(newpipe[1])
        if upperPipes[0]['x'] < -GAME_SPRITES['pipe'][0].get_width():
            upperPipes.pop(0)
            lowerPipes.pop(0)
       # Lets blit our sprites now
        SCREEN.blit(GAME_SPRITES['background'], (0, 0))
        for upperPipe, lowerPipe in zip(upperPipes, lowerPipes):
            SCREEN.blit(GAME_SPRITES['pipe'][0], (upperPipe['x'], upperPipe['y']))
            SCREEN.blit(GAME_SPRITES['pipe'][1], (lowerPipe['x'], lowerPipe['y']))

        SCREEN.blit(GAME_SPRITES['base'], (basex, GROUNDY))
        SCREEN.blit(GAME_SPRITES['player'], (playerx, playery))


def getRandomPipe():
    '''
    Generate pipe one is straight and second 180 rotated
   '''
   offset = SCREENHEIGHT/3
   y2= offset + randrange(0,int(SCREENHEIGHT - GAME_SPRITES['base'].get_height() - 1.2*offset))
   pipeX = SCREENWIDTH + 10
   y1= pipeHeight - y2 + offset
   pipe = [
       {'x': pipeX,'y': -y1}, #Upper Pipe
       {'x':pipeX,'y':y2} #Lower Pipe

   ]

if __name__ == "__main__":
    # This is our main function to be call first
    pygame.init() #initialize pygame module
    FPSCLOCK= pygame.time.Clock()
    pygame.display.set_caption('Flappy Bird by Kamti')
    GAME_SPRITES['numbers']=(
        pygame.image.load('gallery/sprites/0.png').convert_alpha(),
        pygame.image.load('gallery/sprites/1.png').convert_alpha(),
        pygame.image.load('gallery/sprites/2.png').convert_alpha(),
        pygame.image.load('gallery/sprites/3.png').convert_alpha(),
        pygame.image.load('gallery/sprites/4.png').convert_alpha(),
        pygame.image.load('gallery/sprites/5.png').convert_alpha(),
        pygame.image.load('gallery/sprites/6.png').convert_alpha(),
        pygame.image.load('gallery/sprites/7.png').convert_alpha(),
        pygame.image.load('gallery/sprites/8.png').convert_alpha(),
        pygame.image.load('gallery/sprites/9.png').convert_alpha()

    )
    GAME_SPRITES['message'] = pygame.image.load('gallery/sprites/message.png').convert_alpha()
    GAME_SPRITES['base'] =pygame.image.load('gallery/sprites/base.png').convert_alpha()
    GAME_SPRITES['pipe'] =(pygame.transform.rotate(pygame.image.load(PIPE).convert_alpha(),180), #Rotate the pie image 180 degree.
    pygame.image.load(PIPE).convert_alpha()
    )

    #GAME SOUNDS
    GAME_SOUNDS['die'] = pygame.mixer.Sound('gallery/audio/die.wav')
    GAME_SOUNDS['hit'] = pygame.mixer.Sound('gallery/audio/hit.wav')
    GAME_SOUNDS['point'] = pygame.mixer.Sound('gallery/audio/point.wav')
    GAME_SOUNDS['swoosh'] = pygame.mixer.Sound('gallery/audio/swoosh.wav')
    GAME_SOUNDS['wing'] = pygame.mixer.Sound('gallery/audio/wing.wav')
    
    GAME_SPRITES['background'] = pygame.image.load(BACKGROUND).convert()
    GAME_SPRITES['player'] = pygame.image.load(PLAYER).convert_alpha()
    while True:
        welcomScreen() #show welcome screen to the user untill he press a button
        mainGame()
