#ifndef TRIVIAAPP_H
#define TRIVIAAPP_H

#include<QApplication>
#include<QVector>
#include"MainWindow.h"
/*forward declarations*/
class Pregunta;
class QDomDocument;
class QDomElement;
class QFile;

const QString nombreArchivo = "Trivia.xml"; //Constante que almacena el nombre del archivo del que se lee
const int puntajeMaximo = 10;
const int puntajeMinimo = 0;

class TriviaApp : public QApplication{
    /*
    Herencia de la Clase QObject por lo que necesita de la macro Q_OBJECT
    necesario para el moc
    */
    Q_OBJECT

private:

    QVector<Pregunta*> preguntas; //Vector que almacena punteros a las preguntas por realizar
    MainWindow ventana; //Objeto MainWindow usada para mostrar las preguntas por medio de una ventana
    int puntaje; //Lleva registro del puntaje total
    int preguntasRealizadas; //Lleva el registro de la totalidad de preguntas hechas
    int preguntasAcertadas;
    int preguntasFallidas;

public:
    /// Constructor de la clase
    /// @param argc Variable int que tiene la cantidad de los comandos de linea
    /// @param argv Referencia a char que almacena los argumentos de la linea de comandos
    TriviaApp(int argc, char* argv[]);
    /// Destructor de la clase
    ~TriviaApp();
    /// Metodo que entra el ciclo principal y espera ahsta salir o a ser llamado
    /// @return 0 Si fue llamado el metodo exit() a traves del metodo quit(),
    ///           otro valor en caso contrario o error
    int exec();
    /// Metodo que se encarga de la inicializacion y ejecucion del programa
    /// @return 0 ejecucion exitosa, 1 error al abrir archivo, 2 error al "parsear" archivo,
    ///         3 error al cargar(leer) una pregunta
    int iniciar();
    /// Metodo estatico que permite crear una pregunta
    /// @param tipo Referencia a un objeto QString que almacena el tipo de pregunta a crear
    /// @return Regresa un puntero a la pregunta creada,
    ///         si la pregunta no pudo ser creada, regresa un puro a 0 (null)
    static Pregunta* crearPregunta(const QString& tipo);

private:
    /// Constructor de copia de la clase
    TriviaApp(const TriviaApp&);
    /// Operador de asignacion de la clase
    const TriviaApp& operator=(const TriviaApp&);
    /// Este metodo permite hacer el "parseo" del archivo .xml
    /// @param archivo Referencia a un objeto QFile que almacena el archivo abierto
    /// @param nombreArchivo Referencia a un objeto QString que almacena el nombre del archivo
    /// @param documento Referencia a un objeto QDomDocument usado para almacenar el resultado
    ///                  del "parseo" al archivo .xml (Representa al archivo .xml)
    /// @return true en caso de un parseo exitoso, false en caso contrario
    bool parsingXML(QFile& archivo, const QString& nombreArchivo, QDomDocument& documento);
    /// Este metodo permite cargar (crear y leer) una pregunta
    /// @param elementosTrivia Referencia a un QDomElement (elemento de arbol DOM)
    ///                        que contiene la informacion de todas las preguntas
    bool cargarPreguntas( const QDomElement& elementosTrivia);
    /// Este metodo permite actualizar el puntaje que lleva el jugador en el juego
    /// @param valor Referencia a un valor int que indica la puntuacion obtenida por el usuario
    void actualizarEstadistica(const int& valor);

};

#endif
