# !/usr/bin/env python
# -*- coding: utf-8 -*-


from math import sqrt, pow


class Point(object):
    def __init__(self, name, x, y):
        self.name = name
        self.x, self.y = x, y


class Figure():
    def __init__(self):
        self.console_line_length = 40
        
    def calculateDistance(self, point_start, point_end):
        return sqrt(
            pow(point_end.x - point_start.x, 2) + pow(point_end.y - point_start.y, 2)
        )

    def displayConsoleLine(self):
        print("\n".ljust(self.console_line_length, "*"), "\n")
        
        
class Line(Figure):
    def __init__(self, obj_point_a, obj_point_b):
        self.point_a = obj_point_a
        self.point_b = obj_point_b
        Figure.__init__(self)

    def build(self):
        self.side_AB = self.calculateDistance(self.point_a, self.point_b)

    def getPerimeter(self):
        return self.side_AB

    def displayLegendPoints(self):
        self.displayConsoleLine()
        self.displayConsoleLine()
        print("\nPuntos Line: A (x1,y1), B (x2,y2)\n")
        self.displayConsoleLine()
        print("Asignacion Multiple de variables\n")
        self.displayConsoleLine()
        print("x1 = 2")
        print("x2, x3 = x1 ^ 2, 5 * x1")
        print("y1, y2, y3 = 2 * x1, x2 ^ 2, (x1 * x2) + 1")
        self.displayConsoleLine()
        print(
            "Punto {} (x,y): ({},{})".format(
                self.point_a.name,
                self.point_a.x,
                self.point_a.y,
            )
        )
        print(
            "Punto {} (x,y): ({},{})".format(
                self.point_b.name,
                self.point_b.x,
                self.point_b.y,
            )
        )

    def displayPointsDistance(self):
        self.displayConsoleLine()
        print("Distancia de Puntos")
        self.displayConsoleLine()
        print(
            "{} -> {}: {}".format(
                self.point_a.name,
                self.point_b.name,
                self.side_AB,
            )
        )




class Triangle(Figure):
    def __init__(self, obj_point_a, obj_point_b, obj_point_c):
        self.point_a = obj_point_a
        self.point_b = obj_point_b
        self.point_c = obj_point_c
        Figure.__init__(self)
		

    def build(self):
        self.side_AB = self.calculateDistance(self.point_a, self.point_b)
        self.side_AC = self.calculateDistance(self.point_a, self.point_c)
        self.side_BC = self.calculateDistance(self.point_b, self.point_c)

    def getPerimeter(self):
        return self.side_AB + self.side_BC + self.side_AC

    def displayLegendPoints(self):
        self.displayConsoleLine()
        self.displayConsoleLine()
        print("\nPuntos Triangle: A (x1,y1), B (x2,y2), C (x3,y3)\n")
        self.displayConsoleLine()
        print("Asignacion Multiple de variables\n")
        self.displayConsoleLine()
        print("x1 = 2")
        print("x2, x3 = x1 ^ 2, 5 * x1")
        print("y1, y2, y3 = 2 * x1, x2 ^ 2, (x1 * x2) + 1")
        self.displayConsoleLine()
        print(
            "Punto {} (x,y): ({},{})".format(
                self.point_a.name,
                self.point_a.x,
                self.point_a.y,
            )
        )
        print(
            "Punto {} (x,y): ({},{})".format(
                self.point_b.name,
                self.point_b.x,
                self.point_b.y,
            )
        )
        print(
            "Punto {} (x,y): ({},{})".format(
                self.point_c.name,
                self.point_c.x,
                self.point_c.y,
            )
        )

    def displayPointsDistance(self):
        self.displayConsoleLine()
        print("Distancia de Puntos")
        self.displayConsoleLine()
        print(
            "{} -> {}: {}".format(
                self.point_a.name,
                self.point_b.name,
                self.side_AB,
            )
        )
        print(
            "{} -> {}: {}".format(
                self.point_a.name,
                self.point_c.name,
                self.side_AC,
            )
        )
        print(
            "{} -> {}: {}".format(
                self.point_b.name,
                self.point_c.name,
                self.side_BC,
            )
        )


class App(Figure):

    def display(self, Figure):
        self.figure = Figure
        self.figure.displayLegendPoints()
        self.figure.displayPointsDistance()
        self.displayFigurePerimeter()

    def displayFigurePerimeter(self):
        if isinstance(self.figure, Line):
            print("\nLa longitud es {}".format(self.figure.getPerimeter()))
        else:
            print("\nEl perimetro es {}".format(self.figure.getPerimeter()))			


if __name__ == "__main__":
    # Asignacion multiple de variables.
    x1 = 2
    x2, x3 = pow(x1, 2), 5 * x1
    y1, y2, y3 = 2 * x1, pow(x2, 2), x2 * x1 + 1

    point_a = Point("A", x1, y1)
    point_b = Point("B", x2, y2)
    point_c = Point("C", x3, y3)

    line = Line(point_a, point_b)
    line.build()

    triangle = Triangle(point_a, point_b, point_c)
    triangle.build()

    console = App()
    console.display(line)
    console.display(triangle)

