# IMPORTANT NOTES:
#    1) If any included files (fonts, images, sounds) are
#       changed then the .spec file MUST be edited to include them
#    2) Build the executable with this command (saves to dist/ folder)
#       pyinstaller 015_pyinstaller.spec

import os
os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = "hide"
import pygame
import random
import sys

pygame.init()

# Some variables used to initialize the window
# The width and height are in pixels
WIN_WIDTH = 600
WIN_HEIGHT = 480
WIN_BG_COLOR = (26, 110, 43)
TEXT_COLOR = (242, 238, 10)

# This function takes a list of path arguments
# and prepends the sys._MEIPASS variable if the
# application has been run as a pyinstaller executable
# returning the result as a joined system path
def get_real_path(*path_args: str):
    if getattr(sys, "frozen", False):
        my_path = os.path.join(sys._MEIPASS, *path_args)
    else:
        my_path = os.path.join(*path_args)
    return my_path

window = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))
pygame.display.set_caption('PyGame Fancy Basics')
icon = pygame.image.load(get_real_path("img", "melon_icon_64.png"))
icon.convert_alpha()
pygame.display.set_icon(icon)
window.fill(WIN_BG_COLOR)
# Import font
pixeboy_200 = pygame.font.Font(get_real_path("font", "Pixeboy.ttf"), 200)
# Create two lines of text
title_text_1 = pixeboy_200.render("HELLO", True, TEXT_COLOR)
title_text_2 = pixeboy_200.render("WORLD", True, TEXT_COLOR)
# Draw first line of text
text_x = (WIN_WIDTH // 2) - (title_text_1.get_width() // 2)
text_y = 25
window.blit(title_text_1, (text_x, text_y))
# Draw second line of text
text_x = (WIN_WIDTH // 2) - (title_text_2.get_width() // 2)
text_y = 25 + title_text_2.get_height() + 25
window.blit(title_text_2, (text_x, text_y))
# Import image
emoji = pygame.image.load(get_real_path("img", "poop_emoji_sm.png"))
emoji.convert_alpha()
# Let's place the image 25 pixels from the bottom of the window
emoji_x = (WIN_WIDTH // 2) - (emoji.get_width() // 2)
emoji_y = WIN_HEIGHT - 25 - emoji.get_height()
window.blit(emoji, (emoji_x, emoji_y))
pixeboy_20 = pygame.font.Font(get_real_path("font", "Pixeboy.ttf"), 20)
click_text = pixeboy_20.render("Click Me", True, TEXT_COLOR)
text_x = (WIN_WIDTH // 2) - (click_text.get_width() // 2)
text_y = WIN_HEIGHT - 5 - click_text.get_height()
window.blit(click_text, (text_x, text_y))
# We can import audio files with mixer.Sound()
# Only .ogg (Ogg Vorbis) format files should be used
# The audio program Audacity can be used to convert files to .ogg
# Here we will import several and put them in a list
audio = []
audio.append(pygame.mixer.Sound(get_real_path("snd", "toot.ogg")))
audio.append(pygame.mixer.Sound(get_real_path("snd", "toot_echo.ogg")))
audio.append(pygame.mixer.Sound(get_real_path("snd", "toot_trip.ogg")))
audio.append(pygame.mixer.Sound(get_real_path("snd", "toot_wet.ogg")))
clock = pygame.time.Clock()

# The main loop. This while loop runs until "running" is False
running = True
emoji_hover = False
while running is True:
    # We'll get the current mouse cursor position
    mouse_x, mouse_y = pygame.mouse.get_pos()
    # If the rectangle bounding the emoji is currently
    # colliding with the current mouse cursor position
    # Then change cursor
    if emoji.get_rect(topleft=(emoji_x, emoji_y)).collidepoint(mouse_x, mouse_y):
        pygame.mouse.set_cursor(pygame.SYSTEM_CURSOR_HAND)
        emoji_hover = True
    else:
        pygame.mouse.set_cursor(pygame.SYSTEM_CURSOR_ARROW)
        emoji_hover = False
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        # pygame.MOUSEBUTTONDOWN happens the moment a mouse button is clicked
        if event.type == pygame.MOUSEBUTTONDOWN and emoji_hover is True:
            audio[random.randrange(0, len(audio))].play()
        # pygame.KEYDOWN happens the moment a key is pressed down
        if event.type == pygame.KEYDOWN:
            # If the pressed key is "ESC" button, then let's exit
            if event.key == pygame.K_ESCAPE:
                running = False
    pygame.display.flip()
    clock.tick(60)

# We get to this poince once "running" is False.
# Clean up pygame with the quit() method, then exit program.
pygame.quit()
sys.exit()