"""
Module for various Square.
"""
from turtle import Turtle
from point import Point


class Square:
    """
    A Square shape that can draw itself, move, and report area and perimeter.

    corners - [Point] corners of this Shape
    perimeter - length to traverse corners
    area - area of this Shape
    """
    corners: [Point]
    perimeter: float
    area: float

    def __init__(self, corners: [Point])->None:
        """ Create a new Square self with corners.

        Assume that the corners are traversed in order, that the sides
        are equal length, and the vertices are right angles.
        """
        self.corners = corners
        self._turtle = Turtle()
        self._set_perimeter()
        self._set_area()

    def _set_perimeter(self) -> None:
        """ Set Square self's perimeter to the sum of the distances between
        corners.
        """
        distance_list = []
        for i in range(len(self.corners)):
            distance_list.append(self.corners[i].distance(self.corners[i-1]))
        self._perimeter = sum(distance_list)
        # self._perimeter = 4 * self.corners[0].distance(self.corners[1])

    def _set_area(self)->None:
        """ Set the area of Square self to the square of its sides.

        """
        self._area = self.corners[0].distance(self.corners[1]) ** 2

    def _get_perimeter(self)->float:
        """ Return the perimeter of this Square

        """
        return self._perimeter

    def _get_area(self)->float:
        """ Return the area of this Square

        """
        return self._area

    def move_by(self, offset_point: Point)->None:
        """
        Move Square self to a new position by adding Point offset_point to
        each corner.
        """
        self.corners = [c + offset_point for c in self.corners]
        # equivalent to...
        # new_corners = []
        # for c in self.corners:
        #    new_corners.append(c + offset_point)
        # self.corners = new_corners

    def draw(self):
        """
        Draw Square self.

        @type self: Square
        @rtype: None
        """
        self._turtle.penup()
        self._turtle.goto(self.corners[-1].x, self.corners[-1].y)
        self._turtle.pendown()
        for i in range(len(self.corners)):
            self._turtle.goto(self.corners[i].x, self.corners[i].y)
        self._turtle.penup()
        self._turtle.goto(0, 0)
