import pygame
from settings import Direction, Settings

class Snake(pygame.sprite.Sprite):

    def __init__(self):
        super().__init__()
        self.orig_snake_img = pygame.image.load('head.png')
        self.snake_img = pygame.transform.rotate(self.orig_snake_img, 0)
        self.snake_rect = self.snake_img.get_rect(center=(12*32+16, 9*32+16))

        self.snake_direction = Direction.UP
        self.new_snake_direction = Direction.UP

        self.body = []
        self.body_img = pygame.image.load('segment.png')

    def change_direction(self, snake_direction):
        can_change = True

        if snake_direction == Direction.UP and self.snake_direction == Direction.DOWN:
            can_change = False
        if snake_direction == Direction.DOWN and self.snake_direction == Direction.UP:
            can_change = False
        if snake_direction == Direction.LEFT and self.snake_direction == Direction.RIGHT:
            can_change = False
        if snake_direction == Direction.RIGHT and self.snake_direction == Direction.LEFT:
            can_change = False
        if can_change:
            self.new_snake_direction = snake_direction

    def update(self):

        prev_pos = self.snake_rect.copy()

        self.snake_direction = self.new_snake_direction
        self.snake_img = pygame.transform.rotate(self.orig_snake_img, (self.snake_direction.value * -90))

        if self.snake_direction == Direction.UP:
            self.snake_rect.move_ip(0, -32)
        if self.snake_direction == Direction.RIGHT:
            self.snake_rect.move_ip(32, 0)
        if self.snake_direction == Direction.LEFT:
            self.snake_rect.move_ip(-32, 0)
        if self.snake_direction == Direction.DOWN:
            self.snake_rect.move_ip(0, 32)

        self._move_segment(prev_pos)

    def _move_segment(self, prev_pos):
        if len(self.body) > 0:
            last_pos = prev_pos

            for segment in self.body:
                old = segment.copy()
                segment.topleft = last_pos.topleft
                last_pos = old

    def add_segemnt(self):
        if len(self.body) == 0:
            new_segment = self.snake_rect.copy()
        else:
            new_segment = self.body[-1].copy()

        self.body.append(new_segment)

    def border_boundary(self):

        if self.snake_rect.x < 0 or self.snake_rect.x >= Settings.SCREEN_WIDTH.value:
            return False
        elif self.snake_rect.y < 0 or self.snake_rect.y >= Settings.SCREEN_HEIGHT.value:
            return False
        
        return True
