#datos simples
from turtle import *
import random
import math
class Punto:
    def __init__(self,x,y):
        self.x=x    #real
        self.y=y    #real

class LineaCerrada:
    def __init__(self,puntos,inicio,listaPuntos):
        self.puntos=puntos  #int
        self.inicio=inicio  #Punto
        self.listaPuntas=listaPuntas    #lista de puntos

class Estrella:
#al menos un dato simpe
    ALTO_VENTANA=400
    ANCHO_VENTANA=400

    def __init__(self,centro,puntas,radio):
        self.centro=centro  #Punto
        self.puntas=puntas  #entero
        self.radio=radio    #real

#al menos una función
    def generaListaPuntas(self):
        listaPuntas=[]
        anguloPasoRadianes= 2*math.pi/self.puntas
        for i in range(0,self.puntas):
            x=self.centro.x+self.radio*math.sin(i*anguloPasoRadianes)
            y=self.centro.y+self.radio*math.cos(i*anguloPasoRadianes)

            puntaEstrella=Punto(x,y)
            listaPuntas.append(puntaEstrella)

        return listaPuntas

    def generaVentana(self):
        setup(self.ALTO_VENTANA,self.ANCHO_VENTANA,100,100)
        title(f"Ventana {self.ALTO_VENTANA}x{self.ANCHO_VENTANA}")
        screensize(200,200)
        #showturtle()
        hideturtle()
        colormode(255)

    def pintaEstrella(self):
        listaPuntas = self.generaListaPuntas()
        penup()
        for punta in range(0,len(listaPuntas)):
            goto(listaPuntas[punta].x,listaPuntas[punta].y)
            pendown()
        goto(listaPuntas[0].x,listaPuntas[0].y)

    def pintaEstrellas(self):
        listaPuntas = self.generaListaPuntas()
        penup()
#al menos una estructura de control
        for salto in range(1,1+self.puntas//2):
#        for salto in range(1,self.puntas):
            print(f"salto:{salto}")
            for paso in range(0,self.puntas):
                punta = (paso*salto)%self.puntas
                goto(listaPuntas[punta].x,listaPuntas[punta].y)
                pendown()
            goto(listaPuntas[0].x,listaPuntas[0].y)

def controlValorValido(cadenaDato,tipo):
    valorValido=False
    while (not valorValido):
#al menos tenga la capacidad de mostrar un mensaje de depuración de posibles errores, en función del tipo de dato/s que requiera.
        try:
            if(tipo=="int"):
                print("\n-------------------------------------------------------")
                dato = input(f"Indique {cadenaDato} de la estrella:\t")
                dato = int(dato)
            else:
                print("\n-------------------------------------------------------")
                dato = input(f"Indique {cadenaDato} de la estrella:\t")
                dato = float(dato)
        except (ValueError, NotImplementedError):
            print(f"\tEl dato {dato} no es un valor válido para {cadenaDato} de la estrella")
            print(f"\tVuelva a introducir el valor para {cadenaDato} de la estrella")
        else:
            valorValido=True
    return dato

puntas=controlValorValido("el número de puntas","int")
x=controlValorValido("la coordenada x del centro","float")
y=controlValorValido("la coordenada y del centro","float")
radio=controlValorValido("el radio","float")
#al menos una variable

#al menos una ejecución de la sentencia print() al final de su funcionamiento.
print("Se va a mostrar en una ventana aparte varias figuras geométricas con estas características")
print(f"\tValor de puntas:\t{puntas}")
print(f"\tValor de x:\t{x}")
print(f"\tValor de y:\t{y}")
print(f"\tValor de radio:\t{radio}")

centro=Punto(x,y)
estrella=Estrella(centro,puntas,radio)
estrella.generaVentana()
estrella.pintaEstrellas()


