import curses
import time
import itertools
import signal

# Manejador para Ctrl+C
def handle_interrupt(signum, frame):
    print("\nComando detenido manualmente por el usuario.")
    exit(0)

# Asignar el manejador de la señal SIGINT (Ctrl+C)
signal.signal(signal.SIGINT, handle_interrupt)

def select_template():
    result = {}

    emoji_map = {
        "Basic": "📄",
        "Común": "🌟",
        "Market": "💹",
        "Plantilla en blanco": "📝",
        "Simple Bot": "🤖",
        "Bot de economía": "💰",
        "Bot de moderación": "🛡️",
        "Bot de ranking": "🏆",
        "Bot de seguridad": "🔒",
        "Juegos": "🎮",
        "Anime Game": "🌸",
        "Pokemon Game": "🐾",
        "The Magic Game": "🃏",
        "Yu Gi OH Game": "🐉",
        "Streamers Game": "📺",
        "Vtubers Game": "🎤",
        "Crypto": "₿",
        "NFT": "🖼️",
        "Stock": "📈",
        "Market Bot": "📊",
        "Trading Bot": "💸",
        "Wallet Bot": "👛",
        "Notificación Bot": "🔔",
        "Seguridad Bot": "🛡️",
        "← Volver": "↩️"
    }

    menus = {
        "Menú Principal": [
            ("Basic", "Templates básicos para comenzar desde cero"),
            ("Común", "Templates comunes y más populares para comenzar"),
            ("Market", "Templates especializados en mercados financieros (✨PPASS)")
        ],
        "Menú Basic": [
            ("Plantilla en blanco", "Bot totalmente en blanco, ideal para experimentados"),
            ("Simple Bot", "Bot básico con comando de prueba + tutorial para principiantes")
        ],
        "Menú Común": [
            ("Bot de economía", "Economía con juegos sencillos, tienda y premios"),
            ("Bot de moderación", "Fácil de configurar, con comandos /ban, /kick, etc."),
            ("Bot de ranking", "Gana niveles chateando y canjea por premios"),
            ("Bot de seguridad", "Añade una capa extra de seguridad con captcha"),
            ("Juegos", "Templates de juegos populares")
        ],
        "Menú Juegos": [
            ("Anime Game", "Cartas de anime: colecciona, vende y sube en el ranking"),
            ("Pokemon Game", "Cartas de Pokémon: colecciona, vende y sube en el ranking"),
            ("The Magic Game", "Cartas de The Magic: colecciona, vende y sube en el ranking"),
            ("Yu Gi OH Game", "Cartas de Yu Gi OH: colecciona, vende y sube en el ranking"),
            ("Streamers Game", "Cartas de streamers: colecciona, vende y sube en el ranking"),
            ("Vtubers Game", "Cartas de vtubers: colecciona, vende y sube en el ranking")
        ],
        "Menú Market": [
            ("Crypto", "Bots especializados en criptomonedas (solo Hedera por ahora)"),
            ("NFT", "Bots para NFTs (solo Hedera por ahora)"),
            ("Stock", "Bots para forex: acciones, indicadores y ETFs")
        ],
        "Menú Crypto": [
            ("Market Bot", "Sigue precios y crea alertas en tokens populares de Hedera"),
            ("Trading Bot", "Compra y vende tokens de Hedera directamente desde Discord"),
            ("Wallet Bot", "Envía y recibe fondos en wallets de Hedera desde Discord")
        ],
        "Menú NFT": [
            ("Notificación Bot", "Envía notificaciones de ventas de tu colección NFT"),
            ("Seguridad Bot", "Otorga roles a quienes posean un NFT de tu colección")
        ],
        "Menú Stock": [
            ("Market Bot", "Crea alertas sobre precios, indicadores y ETFs en el mercado tradicional")
        ]
    }

    def confirm_selection(stdscr, option):
        stdscr.clear()
        h, w = stdscr.getmaxyx()
        msg = f"¿Estás seguro que deseas seleccionar la plantilla '{option}'?"
        options = ["Sí", "No"]
        selected_idx = 0

        while True:
            stdscr.addstr(h // 2 - 1, w // 2 - len(msg) // 2, msg, curses.A_BOLD)
            for idx, opt in enumerate(options):
                x = w // 2 - len(opt) // 2
                y = h // 2 + idx
                if idx == selected_idx:
                    stdscr.attron(curses.A_REVERSE)
                    stdscr.addstr(y, x, opt)
                    stdscr.attroff(curses.A_REVERSE)
                else:
                    stdscr.addstr(y, x, opt)

            stdscr.refresh()
            key = stdscr.getch()

            if key == curses.KEY_UP and selected_idx > 0:
                selected_idx -= 1
            elif key == curses.KEY_DOWN and selected_idx < len(options) - 1:
                selected_idx += 1
            elif key in [10, 13]:
                return options[selected_idx] == "Sí"

    def curses_main(stdscr):
        curses.curs_set(0)

        def print_menu(menu_title, options, selected_idx):
            stdscr.clear()
            h, w = stdscr.getmaxyx()
            stdscr.addstr(1, w // 2 - len(menu_title) // 2, menu_title, curses.A_BOLD)

            for idx, (option, description) in enumerate(options):
                emoji = emoji_map.get(option, "➡️")
                x = 4
                y = 3 + idx * 2
                if idx == selected_idx:
                    stdscr.attron(curses.A_REVERSE)
                    stdscr.addstr(y, x, f"{emoji} {option}")
                    stdscr.attroff(curses.A_REVERSE)
                else:
                    stdscr.addstr(y, x, f"{emoji} {option}")
                stdscr.addstr(y, x + 20, description, curses.A_DIM)

            stdscr.refresh()

        def navigate_menu(menu_title):
            options = menus[menu_title] + [("← Volver", "")]
            selected_idx = 0
            while True:
                print_menu(menu_title, options, selected_idx)
                key = stdscr.getch()

                if key == curses.KEY_UP and selected_idx > 0:
                    selected_idx -= 1
                elif key == curses.KEY_DOWN and selected_idx < len(options) - 1:
                    selected_idx += 1
                elif key in [10, 13]:
                    selected_option = options[selected_idx][0]
                    if selected_option == "← Volver":
                        return None

                    submenu_title = f"Menú {selected_option}"
                    if submenu_title in menus:
                        res = navigate_menu(submenu_title)
                        if res:
                            return res
                    else:
                        if confirm_selection(stdscr, selected_option):
                            return selected_option
                        else:
                            return navigate_menu("Menú Principal")

        sel = navigate_menu("Menú Principal")
        result['selection'] = sel

    curses.wrapper(curses_main)
    return result.get('selection', None)