from typing import Any

import pygame
import random

# --- Настройки окна ---
HEIGHT = 600
WIDTH = 600
FPS = 60

# --- Цвета ---
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
MEDIUM_SLATE_BLUE = (123, 104, 238)
MEDIUM_ORCHID = (186, 85, 211)
ORANGE = (255, 123, 0)

# --- Инициализация Pygame ---
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Shooter Game")
clock = pygame.time.Clock()

# --- Группы спрайтов ---
all_sprites = pygame.sprite.Group()
enemies = pygame.sprite.Group()
bullets: Any = pygame.sprite.Group()


# --- Классы игры ---

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((40, 40))
        self.image.fill(MEDIUM_ORCHID)
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH / 2
        self.rect.bottom = HEIGHT - 10
        self.speedx = 0
        self.shoot_delay = 250
        self.last_shot = pygame.time.get_ticks()
        self.health = 150  # Добавили здоровье

    def update(self):
        self.speedx = 0
        keystate = pygame.key.get_pressed()
        if keystate[pygame.K_LEFT]:
            self.speedx = -8
        if keystate[pygame.K_RIGHT]:
            self.speedx = 8
        if keystate[pygame.K_SPACE]:
            self.shoot()

        self.rect.x += self.speedx

        if self.rect.right > WIDTH:
            self.rect.right = WIDTH
        if self.rect.left < 0:
            self.rect.left = 0

    def shoot(self):
        now = pygame.time.get_ticks()
        if now - self.last_shot > self.shoot_delay:
            self.last_shot = now
            bullet = Bullet(self.rect.centerx, self.rect.top)
            all_sprites.add(bullet)
            bullets.add(bullet)


class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((30, 30))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.x = random.randrange(WIDTH - self.rect.width)
        self.rect.y = random.randrange(-100, -40)
        self.speedy = random.randrange(1, 4)

    def update(self):
        self.rect.y += self.speedy
        if self.rect.top > HEIGHT + 10:
            self.rect.x = random.randrange(WIDTH - self.rect.width)
            self.rect.y = random.randrange(-100, -40)
            self.speedy = random.randrange(1, 8)


class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((4, 10))
        self.image.fill(WHITE)
        self.rect = self.image.get_rect()
        self.rect.bottom = y
        self.rect.centerx = x
        self.speedy = -10

    def update(self):
        self.rect.y += self.speedy
        if self.rect.bottom < 0:
            self.kill()


# --- Создание объектов ---
player = Player()
all_sprites.add(player)

for i in range(8):
    enemy = Enemy()
    all_sprites.add(enemy)
    enemies.add(enemy)

# --- Игровой цикл ---
score = 0
running = True

while running:
    clock.tick(FPS)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    all_sprites.update()

    # Проверка попадания пуль во врагов
    hits_bullets_enemies = pygame.sprite.groupcollide(bullets, enemies, True, True)
    for hit in hits_bullets_enemies:
        score += 1
        new_enemy = Enemy()
        all_sprites.add(new_enemy)
        enemies.add(new_enemy)

    # Проверка столкновения игрока с врагом (отнимание здоровья)
    hits_player_enemy = pygame.sprite.spritecollide(player, enemies, True)
    for hit in hits_player_enemy:
        player.health -= 25  # Отнимаем по 25 здоровья за касание
        new_enemy = Enemy()  # Создаем нового врага взамен убитого при касании
        all_sprites.add(new_enemy)
        enemies.add(new_enemy)

    # Проверка на смерть (конец игры)
    if player.health <= 0:
        running = False

        # Отрисовка / Рендеринг
    screen.fill(MEDIUM_SLATE_BLUE)

    all_sprites.draw(screen)

    # Вывод счета и здоровья на экран
    font_name = pygame.font.match_font('bahnschrift')
    font = pygame.font.Font(font_name, 25)

    # Счет
    text_surface_score = font.render(f"Счёт: {score}", True, BLACK)
    text_rect_score = text_surface_score.get_rect(topleft=(10, 10))
    screen.blit(text_surface_score, text_rect_score)

    # Здоровье (зеленая полоска и число)
    pygame.draw.rect(screen, RED, (10, 40, 150, 20))  # Красная подложка (макс здоровье)
    pygame.draw.rect(screen, GREEN, (10, 40, player.health, 20))  # Зеленая полоска (текущее здоровье)

    text_surface_health = font.render(f"Здоровье: {player.health}", True, BLACK)
    text_rect_health = text_surface_health.get_rect(topleft=(170, 42))
    screen.blit(text_surface_health, text_rect_health)

    pygame.display.flip()

pygame.quit()