/*
         * - RecuperarUltimoEstado tiene la misión de recuperar los datos del ultimo Estado de un cuestionario puntual
         */
        public List<Estado> recuperarUltimoEstado(Cuestionario cuestAsociado)
        {
            bool conexionExitosa;
            GestorCuestionario gestorCuestionario = new GestorCuestionario();
            List<Estado> listaEstado = new List<Estado>();//Para el retorno de datos

            string consultaSql = "SELECT `Estado_idEstado`,`fecha` FROM `cuestionario` , `cuestionario_estado` WHERE `clave` = '" + cuestAsociado.Clave + "' AND `idCuestionario` = `Cuestionario_idCuestionario`;";

            //llamamos al metodo "iniciar conexion"
            conexionExitosa = iniciarConexion();

            //Evaluamos si la conexion se realizo con exito
            if (!conexionExitosa)
            {
                MessageBox.Show("Fallo la conexion con la base de datos");
                terminarConexion();
                return null;
            }

            //Creamos un adaptador llamado "comando" para realizar la consultaSql que definimos arriba
            MySql.Data.MySqlClient.MySqlCommand comando;
            comando = ObjConexion.CreateCommand();
            //En el adaptador comando hacemos un asignacion en su atributo CommandText de la consultaSql
            comando.CommandText = consultaSql;

            //Se hace la ejecucion del comando con el metodo ExecuterReader
            //y se lo asigna a una variable reader que contendra los resultados de la busqueda en la base de datos
            MySqlDataReader reader = comando.ExecuteReader();

            if (!reader.HasRows)
            {
                //Si el reader esta vacio, es que no encontro el cuestionario
                MessageBox.Show("No se encontro el estado para el cuestionario");
                terminarConexion();
                return null;
            }

            //Lista de caracteristicas auxiliar para contener la fecha y el ID ESTADO del estado que luego seran utilizados para
            //definir el ultimo estado del cuestionario
            List<Caracteristica> lista_fechaYid_Estado = new List<Caracteristica>();

            while (reader.Read())
            {
                DateTime fecha = DateTime.Parse(reader["fecha"].ToString());
                int idEstado = Int32.Parse(reader["Estado_idEstado"].ToString());

                //Creamos un elemento del tipo caracteristica e inicializamos sus partes
                Caracteristica elementoLista;
                elementoLista.dato1 = fecha;
                elementoLista.dato2 = idEstado;
                //Agregamos el elemento a la lista
                lista_fechaYid_Estado.Add(elementoLista);

            }
            terminarConexion();

            //Seteado en esa fecha para hacer las comparaciones desde un punto fijo pero no posible
            DateTime ultimaFecha = DateTime.Parse("1900-01-01");
            int indice = 0; //Se utilizara para ubicar en la lista de las fechas y ID ESTADO al estado correspondiente

            for (int i = 0; i < lista_fechaYid_Estado.Count; i++)
            {
                //Casteamos de la lista el dato1 que contiene la fecha
                DateTime fechaLista = (DateTime)lista_fechaYid_Estado[i].dato1;
                if (DateTime.Compare(ultimaFecha, fechaLista) == -1)
                {
                    ultimaFecha = fechaLista;//actualizamos la variable como la ultima fecha
                    indice = i;//establecemos el indice donde se encuentra este ultimo estado
                }
            }

            //Recuperamos los datos de Estado pasandole el id_estado que se encuentra en la lista
            string estado = this.recuperarEstado((int)lista_fechaYid_Estado[indice].dato2);
            //Instanciamos el estado de cuestionario
            Estado objEstado = gestorCuestionario.instanciarEstado(cuestAsociado, estado, ultimaFecha);

            listaEstado.Add(objEstado);

            return listaEstado;
        }
        /*
         * retornarProximoBloque tiene la misión de recuperar el proximo bloque de un cuestionario a travez de su numero de bloque
         */
        public Bloque retornarBloque(Cuestionario cuestAsociado, int nroBloque)
        {
            GestorCuestionario gestorCuestionario = new GestorCuestionario();
            GestorEvaluacion gestorEvaluacion = new GestorEvaluacion();

            if (cuestAsociado.PuestoEvaluado.Caracteristicas == null)
            {
                //Re-armamos las relaciones del cuestionario para tener todos los objetos en memoria
                bool re_construido = this.reconstruirRelaciones(cuestAsociado);
                if (!re_construido)
                {
                    MessageBox.Show("No se pudo recuperar Todos los datos requeridos");
                    return null;
                }
            }

            bool conexionExitosa;
            List<PreguntaEvaluada> ListapregAsociadas = new List<PreguntaEvaluada>();

            string consultaSql = "SELECT codigo " //Recupero el codigo de las preguntas evaluadas
                + "FROM item_bloque it_Bloq " //Desde la tabla de ITEM_BLOQUE de la base de datos
                //CONDICIONO CON UN JOIN que el id que se encuentra en la tabla de `pregunta evaluada` sea igual al id de la tabla `item_bloque`
                + "JOIN `pregunta evaluada` pEv on (pEv.`idPregunta Evaluada` = it_Bloq.PreguntaEvaluada_idPreguntaEv) "
                //CON UN SEGUNDO JOIN pido que me busque los datos del bloque que condice con el "nroBloque"
                + "JOIN bloque bq on (bq.nroBloque = " + nroBloque + ") "
                //TERCER JOIN pido que me busque entre los cuestionarios los datos del que coincida con el cuestionario que le paso como parametro
                + "JOIN cuestionario cuest on (cuest.clave = '" + cuestAsociado.Clave + "') "
                //Con el WHERE restrinjo que de los datos obtenidos:
                //El id del bloque que se encuentra en la tabla `item_bloque` sea el mismo al del bloque seleccionado en el JOIN
                + "WHERE it_Bloq.Bloque_idBloque = bq.idBloque "
                //Y que el id del cuestionario que esta en la tabla de `bloques` sea el mismo al obtenido del JOIN con la tabla cuestionario
                + "AND bq.Cuestionario_idCuestrionario = cuest.idCuestionario;";

            conexionExitosa = iniciarConexion();

            if (!conexionExitosa)
                return null; //Error de conexion

            MySql.Data.MySqlClient.MySqlCommand comando;
            comando = ObjConexion.CreateCommand();

            comando.CommandText = consultaSql;

            MySqlDataReader reader = comando.ExecuteReader();

            if (!reader.HasRows)//si el reader esta vacio, no se encontro el parametro buscado
                return null;

            while (reader.Read())
            {
                string codigo = reader["codigo"].ToString();

                ListapregAsociadas.Add(gestorEvaluacion.retornarPreguntaDeLaRelacion(cuestAsociado.PuestoEvaluado, codigo));
            }

            terminarConexion();

            bool esUltimoBloque = esUltimimoBloque(cuestAsociado, nroBloque);
            Bloque bloque_R = gestorCuestionario.instanciarBloque(nroBloque, cuestAsociado);
            bloque_R.EsUltimoNloque = esUltimoBloque;
            bloque_R.ListaPreguntasEv = ListapregAsociadas;

            terminarConexion();

            return bloque_R;
        }
        /*
         * - RecuperarCuestionarioActivo tiene la misión de recuperar los datos del cuestionario activo (o en proceso) para un candidato
         */
        public List<Cuestionario> recuperarCuestionarioActivo(Candidato candidato)
        {
            bool conexionExitosa;
            GestorCuestionario gestorCuestionarios = new GestorCuestionario();
            List<Cuestionario> listaCuestionariosAsociados = new List<Cuestionario>(); //Esta es la lista que devuelve el metodo como resultado

            //Declaramos una lista de cuestionarios auxiliar para obtener el historial de cuestionarios del candidato
            List<Cuestionario> preSeleccionCuestionarios = new List<Cuestionario>();

            //Declaramos una lista auxiliar de enteros para almacenar los ID de PUESTOS EVALUADOS
            //con el fin de reconstruir las relaciones minimas en la instanciacion del cuestionario
            List<int> listaIdPuestos = new List<int>();

            //Otra lista auxiliar para guardar los números de bloque
            List<int> listaNroBloque = new List<int>();

            //llamamos al metodo "iniciar conexion"
            conexionExitosa = iniciarConexion();

            //Evaluamos si la conexion se realizo con exito
            if (!conexionExitosa)
            {
                MessageBox.Show("Fallo la conexion con la base de datos");
                terminarConexion();
                return null;
            }

            //Creamos un adaptador llamado "comando" para realizar la consultaSql que definimos abajo
            MySql.Data.MySqlClient.MySqlCommand comando;
            comando = ObjConexion.CreateCommand();

            string consultaSql = "SELECT DISTINCT `clave`, `Puesto Evaluado_idPuesto Evaluado` ,`nroaccesos`, `ultimoBloque` ";
            consultaSql += "FROM `cuestionario` cuest ";
            consultaSql += "JOIN `candidato` cand on (cand.`nro documento` = '" + candidato.NroDoc + "' AND cand.idCandidato = cuest.Candidato_idCandidato) ";
            consultaSql += "JOIN `cuestionario_estado` c_est on (cuest.idCuestionario = c_est.Cuestionario_idCuestionario);";

            //En el adaptador comando hacemos un asignacion en su atributo CommandText de la consultaSql
            comando.CommandText = consultaSql;

            //Se hace la ejecucion del comando con el metodo ExecuterReader
            //y se lo asigna a una variable reader que contendra los resultados de la busqueda en la base de datos
            MySqlDataReader reader = comando.ExecuteReader();

            if (!reader.HasRows)
            {
                //si el reader esta vacio, es qe no encontro a ese candidato
                terminarConexion();
                Cuestionario cues = gestorCuestionarios.instanciarCuestionario(candidato, "NO POSEE", null, 0);
                listaCuestionariosAsociados.Add(cues);
                return listaCuestionariosAsociados;
            }

            //Si el reader contiene datos, se realiza la lectura de todos los ellos.
            while (reader.Read())
            {
                string clave = reader["clave"].ToString();
                int accesos = Int32.Parse(reader["nroAccesos"].ToString());
                int idPuestoEv = Int32.Parse(reader["Puesto Evaluado_idPuesto Evaluado"].ToString());
                int nroBloque;

                if (reader["ultimoBloque"].ToString() == "")//Se contempla la posibilidad de que este número sea nulo
                    nroBloque = 0;//IMPLICA QUE EL CUESTIONARIO ESTA ACTIVO
                else
                    nroBloque = Int32.Parse(reader["ultimoBloque"].ToString());//IMPLICA QUE EL CUESTIONARIO ESTA EN PROCESO

                //Llamamos al gestor de cuestionarios para instanciar el cuestionario que se obtuvo de la base de datos
                Cuestionario cuesAsociado = gestorCuestionarios.instanciarCuestionario(candidato, clave, null, accesos);
                //Cargamos el cuestionario creado a la lista de preSeleccionados
                preSeleccionCuestionarios.Add(cuesAsociado);
                //Cargamos el ID del Puesto Evaludos para luego buscarlo en la base de datos
                listaIdPuestos.Add(idPuestoEv);
                //Cargamos el nroDeBloque
                listaNroBloque.Add(nroBloque);
            }

            /*
             * Como vamos a hacer una llamada a otro metodo que ejecuta una consulta sobre la base de datos
             * Terminamos la conexión antes de seguir adelante
            */
            terminarConexion();

            PuestoEvaluado PuestoEv;
            for (int i = 0; i < listaIdPuestos.Count; i++)
            {
                PuestoEv = this.recuperarPuestoEvaluado(listaIdPuestos[i]);

                List<Estado> listEstado = this.recuperarUltimoEstado(preSeleccionCuestionarios[i]);
                Estado estadoCuest = listEstado[0];

                if (estadoCuest.Estado_ == "ACTIVO" || estadoCuest.Estado_ == "EN PROCESO")
                {
                    //Agrego el puesto evaluado al cuestionario
                    preSeleccionCuestionarios[i].PuestoEvaluado = PuestoEv;
                    //Agrego el estado al cuestionario
                    preSeleccionCuestionarios[i].Estado = estadoCuest;

                    if (Equals(PuestoEv.Codigo, "ELIMINADO") == false)
                    {
                        if (listaNroBloque[i] != 0)//ESTA EN PROCESO
                        {
                            //Agrego el bloque al cuestionario
                            preSeleccionCuestionarios[i].UltimoBloque = this.retornarBloque(preSeleccionCuestionarios[i], listaNroBloque[i]);
                        }
                    }

                    //Luego de agregar el Estado, el bloque y el Puesto Evaluado, agregamos el cuestionario a la lista de retorno
                    listaCuestionariosAsociados.Add(preSeleccionCuestionarios[i]);
                }
                else
                {
                    //Agrego el puesto evaluado al cuestionario
                    preSeleccionCuestionarios[i].PuestoEvaluado = PuestoEv;
                    //Agrego el estado al cuestionario
                    preSeleccionCuestionarios[i].Estado = estadoCuest;
                    listaCuestionariosAsociados.Add(preSeleccionCuestionarios[i]);//Agregamos el error para controlarlo
                }
            }

            return listaCuestionariosAsociados;
        }