import pygame
import copy  
from Direction import Direction
from Segment import Segment

class Snake(pygame.sprite.Sprite):
    def __init__(self):
        self.original_image = pygame.image.load("images/head.png")
        #obraz pomocniczy który zmienia się przy zmianie kierunku 
        self.image = pygame.transform.rotate(self.original_image,0)
        #Współrzędne głowy 
        self.rect = self.image.get_rect(center=(12*32+16, 9*32+16))
        #zmiennne odpowiedzialne za kierunek, oraz nowy wyznaczony kierunek
        self.direction = Direction.UP
        self.new_direction = Direction.UP
        #zapisna ostatni pozycja węża, uzyjemy jej do zmiany pozycji segmentów 
        self.last_position = self.rect
        self.add_segment = False 
        self.segments = []

    def chanege_direction(self, direction):
        change_allowed = True 
        if direction == Direction.UP and self.direction == Direction.DOWN:
            change_allowed = False
        if direction == Direction.DOWN and self.direction == Direction.UP:
            change_allowed = False 
        if direction == Direction.RIGHT and self.direction == Direction.LEFT:
            change_allowed = False
        if direction == Direction.LEFT and self.direction == Direction.RIGHT:
            change_allowed = False      
        
        if change_allowed: 
            self.new_direction = direction

    def update(self):
        self.direction = self.new_direction
        self.image = pygame.transform.rotate(self.original_image, (self.direction.value*-90))
        self.last_position = copy.deepcopy(self.rect)

        if self.direction == Direction.UP:
            self.rect.move_ip(0,-32)
        if self.direction == Direction.DOWN:
            self.rect.move_ip(0,32)
        if self.direction == Direction.RIGHT:
            self.rect.move_ip(32,0)
        if self.direction == Direction.LEFT:
            self.rect.move_ip(-32,0)

        #poruszanie segmentów
        for i in range(len(self.segments)):
            if i == 0:
                self.segments[i].move(self.last_position)
            else:
                self.segments[i].move(self.segments[i-1].last_position)


        #dodawanie nowego segmentu
        if self.add_segment:
            new_segment = Segment()
            if len(self.segments) > 0:
                new_segment.position = copy.deepcopy(self.segments[-1].last_position)
            else:
                new_segment.position = copy.deepcopy(self.last_position)
            self.segments.append(new_segment)
            self.add_segment = False
            

    def draw_segments(self, screen):
        for segment in self.segments:
            screen.blit(segment.image, segment.position)

    def eat_apple(self):
        self.add_segment = True


    def check_collision(self):
        for segment in self.segments:
            if self.rect.topleft == segment.position.topleft:
                return True
        

        if self.rect.top < 0 or self.rect.top >= 608:
            return True
        if self.rect.left <0 or self.rect.left >= 808:
            return True

        return False