import json
import random
import os
import googletrans
from googletrans import Translator
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.clock import Clock
from kivy.metrics import dp


# ... (mantén las funciones cargar_preguntas, mostrar_menu, mostrar_mensaje_porcentaje, jugar, jugar_de_nuevo, seleccionar_idioma, guardar_puntuacion y ver_mejores_puntuaciones) ...
def cargar_preguntas():
    with open("preguntas_es.json", "r", encoding="utf-8") as f:
        preguntas = json.load(f)
    return preguntas

def guardar_puntuacion(puntuacion):
    archivo_puntuaciones = "mejores_puntuaciones.txt"

    if not os.path.exists(archivo_puntuaciones):
        with open(archivo_puntuaciones, "w") as f:
            f.write(f"{puntuacion}\n")
    else:
        with open(archivo_puntuaciones, "r") as f:
            puntuaciones = [int(linea.strip()) for linea in f.readlines()]
        puntuaciones.append(puntuacion)
        puntuaciones.sort(reverse=True)
        puntajes = puntuaciones[:5]
        with open(archivo_puntuaciones, "w") as f:
            for puntuacion in puntajes:
                f.write(f"{puntuacion}\n")

def cargar_puntuaciones():
    archivo_puntuaciones = "mejores_puntuaciones.txt"

    if os.path.exists(archivo_puntuaciones):
        with open(archivo_puntuaciones, "r") as f:
            puntuaciones = [int(linea.strip()) for linea in f.readlines()]
    else:
        puntuaciones = []

    return puntuaciones

def traducir(texto, idioma):
    translator = Translator()
    traduccion = translator.translate(texto, dest=idioma)
    return traduccion.text

class LanguageScreen(Screen):
    def seleccionar_idioma(self, idioma):
        self.manager.idioma = idioma
        self.manager.current = "menu"

class MainMenu(Screen):
    def __init__(self, **kwargs):
        super(MainMenu, self).__init__(**kwargs)
        self.layout = BoxLayout(orientation='vertical')
        self.add_widget(Label(text='Menú principal'))
        self.play_button = Button(text='Jugar')
        self.play_button.bind(on_press=self.start_game)
        self.layout.add_widget(self.play_button)
        self.high_scores_button = Button(text='Ver mejores puntuaciones')
        self.high_scores_button.bind(on_press=self.show_high_scores)
        self.layout.add_widget(self.high_scores_button)
        self.exit_button = Button(text='Salir')
        self.exit_button.bind(on_press=self.exit_app)
        self.layout.add_widget(self.exit_button)
        self.add_widget(self.layout)
    
    def start_game(self, instance):
        self.manager.current = 'game'

    def show_high_scores(self, instance):
        self.manager.current = 'high_scores'

    def exit_app(self, instance):
        App.get_running_app().stop()

class GameScreen(Screen):
    def __init__(self, **kwargs):
        super(GameScreen, self).__init__(**kwargs)
        self.layout = BoxLayout(orientation='vertical')

        self.score_label = Label(text='Puntuación: 0')
        self.layout.add_widget(self.score_label)

        self.question_label = Label(text='')
        self.layout.add_widget(self.question_label)

        # Agregar los botones de respuesta
        self.options_layout = BoxLayout(orientation='vertical')
        for i in range(4):
            button = Button(text='', size_hint_y=None, height=dp(50))
            button.bind(on_release=lambda button: self.submit_answer(button.text))
            self.options_layout.add_widget(button)
        self.layout.add_widget(self.options_layout)

        self.back_button = Button(text='Volver al menú principal')
        self.back_button.bind(on_press=self.go_back)
        self.layout.add_widget(self.back_button)
        self.add_widget(self.layout)

    def on_enter(self):
        self.start_game()

    def on_leave(self):
        self.score_label.text = "Puntuación: 0"
        self.puntaje = 0 # Reiniciar el puntaje
    
    def start_game(self):
        global preguntas
        self.puntaje = 0
        self.total_preguntas = len(preguntas)
        self.preguntas_respondidas = 0
        self.preguntas = preguntas.copy()
        self.tiempo_restante = 10 #segundos
        self.tiempo_agotado_event = self.tiempo_agotado_callback

        self.mostrar_pregunta()


    def mostrar_pregunta(self):
        if self.preguntas:
            self.pregunta_actual = random.choice(self.preguntas)
            self.preguntas.remove(self.pregunta_actual)
            self.question_label.text = self.pregunta_actual["pregunta"]
        
            # Actualizar los botones de respuesta
            opciones = self.pregunta_actual["opciones"]
            random.shuffle(opciones)    
            for i, opcion in enumerate(opciones):
                self.options_layout.children[i].text = opcion
            self.enable_buttons()
            Clock.schedule_once(self.tiempo_agotado_event, self.tiempo_restante)

        else:
            self.question_label.text = "¡Felicidades, lo lograste!"
            self.disable_buttons()
        

    def submit_answer(self, respuesta):
        if self.tiempo_agotado:
            return
        self.preguntas_respondidas += 1
        if respuesta == self.pregunta_actual["respuesta_correcta"]:
            self.puntaje += 1
            self.score_label.text = f'Puntuación: {self.puntaje}'
        else:
            mensaje_porcentaje = self.mostrar_mensaje_porcentaje()
            self.question_label.text = f"Respuesta incorrecta. La respuesta correcta es: {self.pregunta_actual['respuesta_correcta']}. Tu puntaje final es: {self.puntaje}. {mensaje_porcentaje}"
            self.disable_buttons()
            guardar_puntuacion(self.puntaje)
            self.puntaje = 0 # Reiniciar el puntaje
            return

        self.mostrar_pregunta()

    def disable_buttons(self):
        for button in self.options_layout.children:
            button.disabled = True  

    def enable_buttons(self):
        for button in self.options_layout.children:
            button.disabled = False

    def tiempo_agotado_callback(self, dt):
        self.tiempo_agotado()

    def tiempo_agotado(self):
        self.disable_buttons()
        mensaje_porcentaje = self.mostrar_mensaje_porcentaje()
        self.question_label.text = f"Se acabó el tiempo. La respuesta correcta es: {self.pregunta_actual['respuesta_correcta']}. Tu puntaje final es: {self.puntaje}. {mensaje_porcentaje}"
        guardar_puntuacion(self.puntaje)
        self.puntaje = 0 # Reiniciar el puntaje
        Clock.unschedule(self.tiempo_agotado_event)


    def go_back(self, instance):
        self.manager.current = 'menu'


    def mostrar_mensaje_porcentaje(self):
        porcentaje_aciertos = (self.puntaje / self.preguntas_respondidas) * 100

        if porcentaje_aciertos >= 75:
            mensaje = "¡Excelente trabajo!"
        elif porcentaje_aciertos >= 50:
            mensaje = "¡Buen trabajo!"
        elif porcentaje_aciertos >= 25:
            mensaje = "Puedes hacerlo mejor."
        else:
            mensaje = "Sigue practicando."

        return mensaje


    def go_back(self, instance):
        self.manager.current = 'main_menu'

class HighScoresScreen(Screen):
    def __init__(self, **kwargs):
        super(HighScoresScreen, self).__init__(**kwargs)
        self.layout = BoxLayout(orientation='vertical')
        self.high_scores_label = Label(text='')
        self.layout.add_widget(self.high_scores_label)
        self.back_button = Button(text='Volver al menú principal')
        self.back_button.bind(on_press=self.go_back)
        self.layout.add_widget(self.back_button)
        self.add_widget(self.layout)

    def on_enter(self):
        self.show_high_scores()


    def show_high_scores(self):
        archivo_puntuaciones = "mejores_puntuaciones.txt"

        if os.path.exists(archivo_puntuaciones):
            with open(archivo_puntuaciones, "r") as f:
                puntuaciones = [int(linea.strip()) for linea in f.readlines()]
            puntuaciones = puntuaciones[:5] 
            self.high_scores_label.text = "Mejores puntuaciones:\n" + "\n".join(str(puntuacion) for puntuacion in puntuaciones)
        else:
            self.high_scores_label.text = "No hay puntuaciones guardadas."

    def go_back(self, instance):
        self.manager.current = 'main_menu'

class TriviaApp(App):
    def build(self):
        sm = ScreenManager()
        sm.add_widget(MainMenu(name='main_menu'))
        sm.add_widget(GameScreen(name='game'))
        sm.add_widget(HighScoresScreen(name='high_scores'))
        return sm

if __name__ == "__main__":
    preguntas = cargar_preguntas()
    TriviaApp().run()