import random
import pygame
import json

# --- КОНФИГУРАЦИЯ ---
WIDTH = 1266
HEIGHT = 668
FPS = 85
BLOCK_SIZE = 15  # Размер блока змейки и еды

# --- ЦВЕТА ---
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
green = (0, 255, 0)
blue = (0, 0, 255)
yellow = (245, 130, 0)

# --- ИНИЦИАЛИЗАЦИЯ PYGAME ---
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("зМеЕнЫшЬ")
clock = pygame.time.Clock()

# --- КЛАСС ИГРОКА (ЗМЕЙКА) ---
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((BLOCK_SIZE, BLOCK_SIZE))
        self.image.fill(green)
        self.rect = self.image.get_rect()
        self.rect.x = WIDTH // 2
        self.rect.y = HEIGHT // 2
        self.dx = 0
        self.dy = 0
        self.body = []
        self.length = 1
        self.score = 0
        self.speed = 15

    def update(self):
        # Движение головы
        self.rect.x += self.dx
        self.rect.y += self.dy

        # Добавляем новую позицию головы в тело
        self.body.append([self.rect.x, self.rect.y])

        # Если тело длиннее допустимого, удаляем хвост
        if len(self.body) > self.length:
            del self.body[0]

        # Проверка столкновения с собственным телом
        for segment in self.body[:-1]:
            if segment[0] == self.rect.x and segment[1] == self.rect.y:
                return False  # Игра окончена
        return True  # Продолжаем игру

    def draw_body(self, surface):
        for segment in self.body[:-1]:  # Рисуем всё тело, кроме головы (голова — это спрайт)
            pygame.draw.rect(surface, green, [segment[0], segment[1], BLOCK_SIZE, BLOCK_SIZE])

    def grow(self):
        self.length += 1
        """
<-- Это идиотизм
        """
        self.score += 1


# --- КЛАСС ЕДЫ ---
class Meat(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((BLOCK_SIZE, BLOCK_SIZE))
        self.image.fill(red)
        self.rect = self.image.get_rect()
        self.respawn()

    def respawn(self):
        # Генерация еды только в координатах, кратных размеру блока
        self.rect.x = random.randrange(0, WIDTH - BLOCK_SIZE, BLOCK_SIZE)
        self.rect.y = random.randrange(0, HEIGHT - BLOCK_SIZE, BLOCK_SIZE)



# --- СОЗДАНИЕ ГРУПП И ОБЪЕКТОВ ---
all_sprites = pygame.sprite.Group()
meats = pygame.sprite.Group()

with open('Baza.json', 'r', encoding='utf-8') as f:
    dataR = json.load(f)
    print(f'\ndataR: {dataR}\n')

player = Player()
player.rect.x = dataR["X"]
player.rect.y = dataR["Y"]
player.body = dataR["Body"]
print(f'\nbody: {player.body}\n')
player.length = dataR["Length"]
print(f'\nlength: {player.length}\n')
player.score = dataR["Score"]
print(f'\nplayer.score: {player.score}\n')
meat = Meat()

all_sprites.add(player)
all_sprites.add(meat)
meats.add(meat)





# --- ГЛАВНЫЙ ИГРОВОЙ ЦИКЛ ---
running = True
while running:
    # --- ОБРАБОТКА СОБЫТИЙ ---
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        if event.type == pygame.KEYDOWN:
            # Управление (запрет движения назад на себя)
            if event.key == pygame.K_w and player.dy == 0:
                player.dy = -BLOCK_SIZE
                player.dx = 0
            elif event.key == pygame.K_s and player.dy == 0:
                player.dy = BLOCK_SIZE
                player.dx = 0
            elif event.key == pygame.K_a and player.dx == 0:
                player.dx = -BLOCK_SIZE
                player.dy = 0
            elif event.key == pygame.K_d and player.dx == 0:
                player.dx = BLOCK_SIZE
                player.dy = 0
            elif event.key == pygame.K_r:
                data = {
                    "X": player.rect.x,
                    "Y": player.rect.y,
                    "Body": player.body,
                    "Length": player.length,
                    "Score": player.score
                }
                with open('Baza.json', 'w', encoding='utf-8') as f:
                    json.dump(data, f)
                    print(f'\nWRITING dataR: {dataR}\n')

    # --- ОБНОВЛЕНИЕ ЛОГИКИ ---
    if not player.update():  # Проверка столкновения с собой
        running = False

    # Проверка выхода за границы экрана
    if (player.rect.x < 0 or player.rect.x >= WIDTH or
            player.rect.y < 0 or player.rect.y >= HEIGHT):
        running = False

    # Проверка поедания еды (столкновение спрайтов)
    if pygame.sprite.spritecollide(player, meats, True):
        player.grow()

        new_meat = Meat()

        # Проверка: не появилась ли еда внутри тела змейки (опционально для честности)
        while any(
                new_meat.rect.colliderect(pygame.Rect(seg[0], seg[1], BLOCK_SIZE, BLOCK_SIZE)) for seg in player.body):
            new_meat.respawn()

        all_sprites.add(new_meat)
        meats.add(new_meat)

    # --- ОТРИСОВКА ---
    screen.fill(black)  # Заливка фона черным

    # Отрисовка всех спрайтов (еда и голова змейки)
    all_sprites.draw(screen)

    # Отрисовка тела змейки (которое не является спрайтом)
    player.draw_body(screen)

    # Отрисовка счета в углу экрана
    font = pygame.font.SysFont("Arial", 25)
    score_text = font.render(f"Счёт: {player.score}", True, white)
    screen.blit(score_text, [10, 10])

    pygame.display.flip()  # Обновление экрана

    clock.tick(player.speed)  # Ограничение FPS

pygame.quit()