""" Demonstration of Composition """

from turtle import Turtle
from lectures.week2.point import Point


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

    === Attributes ===
    @type corners: list[Point]
       corners of this RightAngleTriangle
    @type perimeter: float
       length to traverse corners
    @type area: float
        area of this RightAngleTriangle
    """
    def __init__(self, corners):
        """
        Create a new RightAngleTriangle self with corners.

        TODO this isn't true for RAT
        Assume the corners are traversed in order, that
        the sides are of equal length, and that the vertices
        are right angles.

        @type self: RightAngleTriangle
        @type corners: list[Point]
        @rtype: None
        """
        # shallow copy of corners
        self.corners = corners[:]
        self._turtle = Turtle()
        self._set_perimeter()
        self._set_area()

    def _set_perimeter(self):
        """
        Set RightAngleTriangle self's perimeter to the sum of the distances
        between corners.

        @type self: RightAngleTriangle
        @rtype: None
        """
        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)

    def _get_perimeter(self):
        """
        Return the perimeter of this RightAngleTriangle

        @type self: RightAngleTriangle
        @rtype: float
        """
        return self._perimeter

    # perimeter is immutable --- no setter method in property
    perimeter = property(_get_perimeter)

    def _set_area(self):
        """
        Set the area of RightAngleTriangle self to the RightAngleTriangle of
        its sides.

        @type self: RightAngleTriangle
        @rtype: None
        """
        # TODO this needs to change
        self._area = self.corners[0].distance(self.corners[1])**2

    def _get_area(self):
        """
        Return the area of RightAngleTriangle self.

        @type self: RightAngleTriangle
        @rtype: float

        >>> RightAngleTriangle([Point(1, 1), Point(2, 1), Point(1, 2)]).area
        0.5
        """
        return self._area

    # area is immutable --- no setter method in property
    area = property(_get_area)

    def move_to(self, x_offset, y_offset):
        """
        Move RightAngleTriangle self to a new position by adding
        Point offset_point to each corner.

        @type self: RightAngleTriangle
        @type x_offset: float | int
        @type y_offset: float | int
        @rtype: None
        """
        for c in self.corners:
            c.move(x_offset, y_offset)

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

        @type self: RightAngleTriangle
        @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)


if __name__ == "__main__":
    import doctest
    doctest.testmod()
    s = RightAngleTriangle([Point(1, 1), Point(1, 2), Point(2, 2), Point(2, 1)])
    print(s.area)
    print(s.perimeter)
    s.draw()
