import random
import tkinter as tk

# Constants
WINDOW_WIDTH = 800
WINDOW_HEIGHT = 600
PLAYER_WIDTH = 50
PLAYER_HEIGHT = 30
ENEMY_WIDTH = 50
ENEMY_HEIGHT = 30
BULLET_WIDTH = 5
BULLET_HEIGHT = 10
PLAYER_SPEED = 20
ENEMY_SPEED = 5
BULLET_SPEED = 20  # Increased bullet speed


class SpaceInvaders:
    def __init__(self, root):
        self.root = root
        self.root.title("Space Invaders")
        self.canvas = tk.Canvas(
            root, width=WINDOW_WIDTH, height=WINDOW_HEIGHT, bg="black"
        )
        self.canvas.pack()

        self.player = self.create_player()
        self.enemies = self.create_all_enemies()

        self.bullets = []
        self.enemy_direction = 1

        self.root.bind("<Left>", self.move_left)
        self.root.bind("<Right>", self.move_right)
        self.root.bind("<space>", self.shoot)

        self.update_game()

    def create_player(self):
        return self.canvas.create_rectangle(
            WINDOW_WIDTH // 2 - PLAYER_WIDTH // 2,
            WINDOW_HEIGHT - PLAYER_HEIGHT - 10,
            WINDOW_WIDTH // 2 + PLAYER_WIDTH // 2,
            WINDOW_HEIGHT - 10,
            fill="blue",
        )

    def create_all_enemies(self):
        enemies = []
        for i in range(5):
            for j in range(3):
                enemy = self.canvas.create_rectangle(
                    100 + i * 100,
                    50 + j * 50,
                    100 + i * 100 + ENEMY_WIDTH,
                    50 + j * 50 + ENEMY_HEIGHT,
                    fill="red",
                )
                enemies.append(enemy)
        return enemies

    def move_left(self, event):
        self.canvas.move(self.player, -PLAYER_SPEED, 0)

    def move_right(self, event):
        self.canvas.move(self.player, PLAYER_SPEED, 0)

    def shoot(self, event):
        x1, y1, x2, y2 = self.canvas.coords(self.player)
        bullet = self.create_bullet((x1 + x2) // 2, y1)
        self.bullets.append(bullet)

    def create_bullet(self, x, y):
        return self.canvas.create_rectangle(
            x - BULLET_WIDTH // 2,
            y - BULLET_HEIGHT,
            x + BULLET_WIDTH // 2,
            y,
            fill="yellow",
        )

    def update_game(self):
        self.move_enemies()
        self.move_bullets()
        self.check_collisions()
        self.root.after(50, self.update_game)

    def move_enemies(self):
        change_direction = False
        for enemy in self.enemies:
            self.canvas.move(enemy, self.enemy_direction * ENEMY_SPEED, 0)
            x1, y1, x2, y2 = self.canvas.coords(enemy)
            if x2 >= WINDOW_WIDTH or x1 <= 0:
                change_direction = True

        if change_direction:
            self.enemy_direction *= -1
            for enemy in self.enemies:
                self.canvas.move(enemy, 0, ENEMY_HEIGHT)

    def move_bullets(self):
        for bullet in self.bullets:
            self.canvas.move(bullet, 0, -BULLET_SPEED)
            x1, y1, x2, y2 = self.canvas.coords(bullet)
            if y2 <= 0:
                self.canvas.delete(bullet)
                self.bullets.remove(bullet)

    def check_collisions(self):
        for bullet in self.bullets:
            x1, y1, x2, y2 = self.canvas.coords(bullet)
            for enemy in self.enemies:
                ex1, ey1, ex2, ey2 = self.canvas.coords(enemy)
                if x1 < ex2 and x2 > ex1 and y1 < ey2 and y2 > ey1:
                    self.canvas.delete(bullet)
                    self.canvas.delete(enemy)
                    self.bullets.remove(bullet)
                    self.enemies.remove(enemy)
                    self.create_explosion(ex1, ey1, ex2, ey2)
                    break

    def create_explosion(self, x1, y1, x2, y2):
        explosion = self.canvas.create_oval(
            x1, y1, x2, y2, fill="orange", outline="yellow"
        )
        self.root.after(100, self.canvas.delete, explosion)


if __name__ == "__main__":
    root = tk.Tk()
    game = SpaceInvaders(root)
    root.mainloop()
