import json
import os
from datetime import datetime
from colorama import init, Fore, Back, Style

init(autoreset=True)

# Paleta de colores azul bebé
COLOR_PRINCIPAL = "\033[38;2;137;207;240m"
COLOR_SECUNDARIO = "\033[38;2;173;216;230m"
COLOR_DESTACADO = "\033[38;2;240;248;255m"

class GestorActividades:
    def __init__(self, archivo="actividades.json"):
        self.archivo = archivo
        self.actividades = self.cargar_actividades()
    
    def cargar_actividades(self):
        if os.path.exists(self.archivo):
            try:
                with open(self.archivo, 'r') as f:
                    return json.load(f)
            except:
                return {}
        return {}

    def guardar_actividades(self):
        with open(self.archivo, 'w') as f:
            json.dump(self.actividades, f, indent=2)

    def crear_actividad(self):
        print(f"\n{COLOR_PRINCIPAL}== Crear Nueva Actividad ==")
        nombre = input(f"{COLOR_SECUNDARIO}Nombre de la actividad: ")
        
        datos = {
            'descripcion': input(f"{COLOR_SECUNDARIO}Descripción breve: "),
            'tipo': self.seleccionar_opcion(["Juego", "Ronda", "Actividad Motora", "Manualidad"]),
            'edad': self.seleccionar_opcion(["1-3 años", "4-6 años", "Adulto Mayor"]),
            'duracion': int(input(f"{COLOR_SECUNDARIO}Duración en minutos (5-60): ")),
            'materiales': input(f"{COLOR_SECUNDARIO}Materiales necesarios (separar por comas): ").split(','),
            'instrucciones': self.obtener_multilinea("Instrucciones (escriba 'fin' en nueva línea para terminar):"),
            'fecha_creacion': datetime.now().strftime("%d/%m/%Y")
        }
        
        self.actividades[nombre] = datos
        self.guardar_actividades()
        print(f"{COLOR_DESTACADO}✔ Actividad '{nombre}' creada exitosamente!")

    def mostrar_actividad(self, nombre):
        if actividad := self.actividades.get(nombre):
            print(f"\n{COLOR_PRINCIPAL}== {nombre} ==")
            print(f"{COLOR_SECUNDARIO}Edad: {actividad['edad']}")
            print(f"{COLOR_SECUNDARIO}Duración: {actividad['duracion']} min")
            print(f"{COLOR_SECUNDARIO}Materiales: {', '.join(actividad['materiales']}")
            print(f"{COLOR_SECUNDARIO}Instrucciones:\n{COLOR_DESTACADO}{actividad['instrucciones']}")
        else:
            print(f"{Fore.RED}✖ Actividad no encontrada")

    def listar_actividades(self):
        print(f"\n{COLOR_PRINCIPAL}== Actividades Disponibles ({len(self.actividades)}) ==")
        for i, (nombre, datos) in enumerate(self.actividades.items(), 1):
            print(f"{COLOR_SECUNDARIO}{i}. {nombre} ({datos['edad']}) - {datos['duracion']}min")

    def planificar_semana(self):
        print(f"\n{COLOR_PRINCIPAL}== Planificador Semanal (60 minutos) ==")
        tiempo_total = 0
        actividades = []
        
        while tiempo_total < 60:
            self.listar_actividades()
            seleccion = input(f"{COLOR_SECUNDARIO}Seleccione actividad (número) o 'fin' para terminar: ")
            
            if seleccion.lower() == 'fin':
                break
            
            if nombre := list(self.actividades.keys())[int(seleccion)-1]:
                duracion = self.actividades[nombre]['duracion']
                if (tiempo_total + duracion) <= 60:
                    actividades.append((nombre, duracion))
                    tiempo_total += duracion
                    print(f"{COLOR_DESTACADO}✓ Agregado: {nombre} (+{duracion}min) Total: {tiempo_total}min")
                else:
                    print(f"{Fore.RED}✖ Tiempo excedido. Máximo disponible: {60 - tiempo_total}min")

        print(f"\n{COLOR_PRINCIPAL}== Planificación Final ==")
        for nombre, duracion in actividades:
            print(f"{COLOR_SECUNDARIO}• {nombre} ({duracion}min)")
        print(f"{COLOR_DESTACADO}Total: {tiempo_total} minutos")

    # Métodos auxiliares
    def seleccionar_opcion(self, opciones):
        print(f"{COLOR_SECUNDARIO}Opciones disponibles:")
        for i, opcion in enumerate(opciones, 1):
            print(f"{COLOR_DESTACADO}{i}. {opcion}")
        return opciones[int(input(f"{COLOR_SECUNDARIO}Seleccione una opción (número): "))-1]

    def obtener_multilinea(self, mensaje):
        print(f"{COLOR_SECUNDARIO}{mensaje}")
        lineas = []
        while True:
            linea = input()
            if linea.lower() == 'fin':
                break
            lineas.append(linea)
        return '\n'.join(lineas)

def menu_principal():
    print(f"\n{COLOR_PRINCIPAL}== Gestor de Actividades Recreativas ==")
    print(f"{COLOR_SECUNDARIO}1. Crear nueva actividad")
    print(f"{COLOR_SECUNDARIO}2. Ver actividad")
    print(f"{COLOR_SECUNDARIO}3. Listar todas las actividades")
    print(f"{COLOR_SECUNDARIO}4. Planificar sesión semanal")
    print(f"{COLOR_SECUNDARIO}5. Salir")
    return input(f"{COLOR_DESTACADO}Seleccione una opción: ")

def main():
    gestor = GestorActividades()
    
    while True:
        opcion = menu_principal()
        
        if opcion == '1':
            gestor.crear_actividad()
        elif opcion == '2':
            nombre = input(f"{COLOR_SECUNDARIO}Nombre de la actividad a ver: ")
            gestor.mostrar_actividad(nombre)
        elif opcion == '3':
            gestor.listar_actividades()
        elif opcion == '4':
            gestor.planificar_semana()
        elif opcion == '5':
            print(f"{COLOR_PRINCIPAL}¡Hasta la próxima sesión! 👋")
            break
        else:
            print(f"{Fore.RED}Opción no válida")

if __name__ == "__main__":
    main()