import pygame
import math

# Einstellungsteil

# Fenster
pygame.init()
screen = pygame.display.set_mode((1000, 600))
clock = pygame.time.Clock()
running = True

# Name des Fensters
pygame.display.set_caption("Turret Spiel")

# Font fürs Text
font = pygame.font.Font(None, 20)

# Funktion, die Text schreibt
def write(text, location, color="black"):
    screen.blit(font.render(text, True, color), location)

# Funktion, die Geschenk zeichnet
def draw_target(pos, size, color="red"):
    pygame.draw.rect(screen, color, [pos.x, pos.y - size + 1, size, size])
    pygame.draw.rect(screen, "green", [pos.x + size / 2 - size / 10, pos.y - size + 1, size / 5, size])
    pygame.draw.rect(screen, "green", [pos.x, pos.y - size + 1 + size / 3, size, size / 5])
    pygame.draw.rect(
        screen,
        "green",
        [pos.x + size / 2, pos.y - size - 4, 10, 5],
        border_bottom_left_radius=0,
        border_top_left_radius=15,
        border_top_right_radius=15,
        border_bottom_right_radius=15,
    )

# Textkoordinaten
text_angle_location = pygame.Vector2(80, 520)
text_power_location = pygame.Vector2(80, 540)
text_h_location = pygame.Vector2(80, 560)

text_level_location = pygame.Vector2(900, 80)
#Level und Win
game_level = 1
game_win = 0

#Textkoordinaten für Win
text_win_location = pygame.Vector2(450, 50)

# Höhe und Breite des Fensters
screen_high = 600
screen_width = 1000

# Parameter fürs Boden
ground_begin = pygame.Vector2(0, screen_high - 100 + 3)
ground_end = pygame.Vector2(screen_width, screen_high - 100 + 3)

# Lauf Parameter
gun_length = 30
gun_angle = 45
gun_begin = pygame.Vector2(100, 500)
gun_end = pygame.Vector2(100 + gun_length * math.cos(math.radians(gun_angle)),
                         500 - gun_length * math.sin(math.radians(gun_angle)))

gun_power = 50

# Kugel Zeit-Parameter
bullet_tick = 0
bullet_time = 0
# Zwei Geschwindigkeiten der Kugel
bullet_speed_x = 0
bullet_speed_y = 0  

# Turret Startposition
turret_pos = pygame.Vector2(100, 500)

# Anfangskoordinaten -- Entfernung und Höhe
bullet_s = 100
bullet_h = 500
bullet_pos = pygame.Vector2(bullet_s, bullet_h)

#Wand
wall_1_x = 500
wall_1_high = 50
wall_1_width = 10

# Geschenk Parameter
target_x = 650
target_y = 500
target_size = 40
target_move = 0
target_step = -1

# while-Schleife
while running:

    # 6o Wiederholungen pro Sekunde, bzw. 60 fps. Wenn wir diese Zeile weglassen, wird die gesamte CPU-Leistung genutzt.
    clock.tick(60)

    # Fenster zu schließen
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # Fenster mit weiße Farbe ausfüllen
    screen.fill("white")

    # Boden zeichnen
    pygame.draw.line(screen, "black", ground_begin, ground_end, 5)
    # Turret zeichnen
    pygame.draw.circle(screen, "black", turret_pos, 20, 0,
                       True, True, False, False)
    # Lauf zeichnen
    pygame.draw.line(screen, "black", gun_begin, gun_end, 5)

    # Text:
    # Winkel
    text_angle = "Angle: " + str(gun_angle)
    write(text_angle, text_angle_location)
    # Kraft
    text_power = "Power: " + str(gun_power)
    write(text_power, text_power_location)
    # Höhe
    text_h = "High: " + str(int(bullet_h))
    write(text_h, text_h_location)

    keys = pygame.key.get_pressed()

    # Spiel von Vorne anfangen
    if keys[pygame.K_ESCAPE]:
        game_level = 1
        target_x = 650
        target_move = 0
        game_win = 0

    # Spiel anhalten, andere Tasten ignorieren
    if game_win == 1:
        continue

    # W und S für Winkel
    if keys[pygame.K_w]:
        if gun_angle < 80:
            gun_angle += 1

    if keys[pygame.K_s]:
        if gun_angle > 10:
            gun_angle -= 1
    gun_end = pygame.Vector2(100 + gun_length * math.cos(math.radians(gun_angle)),
                             500 - gun_length * math.sin(math.radians(gun_angle)))

    # A und D für Kraft
    if keys[pygame.K_a]:
        if gun_power > 40:
            gun_power -= 1

    if keys[pygame.K_d]:
        if gun_power < 100:
            gun_power += 1

    # Leertaste -- Kugelschoß
    if keys[pygame.K_SPACE]:
        if bullet_tick == 0:
            bullet_tick = 1
            bullet_speed_x = gun_power * math.cos(math.radians(gun_angle))
            bullet_speed_y = gun_power * math.sin(math.radians(gun_angle))

    # Kugel Zeitskalierung
    bullet_time = bullet_tick / 10

    # Kugel y-Koordinate
    bullet_h = bullet_speed_y * bullet_time - (9.8 * bullet_time * bullet_time) / 2
    bullet_pos.y = 500 - bullet_h

    # Kugel x-Koordinate
    bullet_s = bullet_speed_x * bullet_time
    bullet_pos.x = 100 + bullet_s

    # Kugel zeichnen
    pygame.draw.circle(screen, "red", bullet_pos, 3)

    match game_level:
        case 1:
            # Große Geschenk, kleine Wand
            target_size = 40
            wall_1_high = 50
        case 2:
            # Geschenk -- neue Position
            target_x = 900
        case 3:
            # Geschenk -- neue Größe und Position
            target_size = 25
            target_x = 800
        case 4:
            # Wand mitte
            wall_1_high = 200
        case 5:
            # Wand hoch
            wall_1_high = 300
        case 6:
            # Wand höher
            wall_1_high = 400
        case 7:
            # Geschenk -- Bewegung
            target_move = 1
        case _:
            write("You win!", text_win_location, "red")
            game_win = 1

    # Geschenk -- Bewegen in Level 7
    if target_move == 1:
        if target_x <= 550 or target_x >= 950:
            target_step *= -1
        target_x += target_step

    # Geschenk Position
    target_pos = pygame.Vector2(target_x, target_y)
    # Geschenk Zeichnen
    draw_target(target_pos, target_size)

    # Wand Position
    wall_1_pos = pygame.Vector2(wall_1_x, screen_high - 100 - wall_1_high)
    # Wand Zeichnen
    pygame.draw.rect(screen, "black", [wall_1_pos.x, wall_1_pos.y, wall_1_width, wall_1_high + 1])

    # Level-Nummer anzeigen
    text_game_level = "Level: " + str(game_level)
    write(text_game_level, text_level_location)

    # Objekte auf den Schirm anzuzeigen
    pygame.display.flip()

    # Überprüfungen
    # Wir prüfen, ob die Kugel den Boden erreicht hat, und wenn ja, stoppen wir sie.
    if bullet_h <= 0:
        bullet_tick = 0

    # Kugel stoppt, wenn der Kugel das Geschenk berüht
    if (bullet_pos.x >= target_pos.x and bullet_pos.x <= target_pos.x + target_size
            and bullet_pos.y >= target_pos.y - target_size and bullet_pos.y <= target_pos.y):
        game_level += 1
        bullet_tick = 0

    # Kugel stoppt, wenn der Kugel die Wand berüht
    if (bullet_pos.x >= wall_1_pos.x and bullet_pos.x <= wall_1_pos.x + wall_1_width
            and bullet_pos.y >= wall_1_pos.y and bullet_pos.y <= wall_1_pos.y + wall_1_high):
        bullet_tick = 0

    # Wenn der Ball den Boden noch nicht erreicht hat, erhöhen wir die Variable bullet_tick kontinuierlich:
    if bullet_tick > 0:
        bullet_tick += 1

pygame.quit() 