/// <summary>
        /// Postavljanje gesla za uporabnika
        /// </summary>
        /// <param name="geslo">Plain text geslo katero hashiramo in spremamo v bazo</param>
        /// <param name="idUporabnika">ID uporabnika za terog spremamo geslo</param>
        /// <returns></returns>
        public static bool HashirajGeslo(int idUporabnika, string geslo)
        {
            byte[] gesloBytes = Encoding.UTF8.GetBytes(geslo);
            byte[] saltBytes  = Encoding.UTF8.GetBytes(CreateSalt(20));
            byte[] hash       = GenerateSaltedHash(gesloBytes, saltBytes);

            List <Uporabnik> lista = Brskaj(idUporabnika);
            Uporabnik        u     = lista.Count > 0 ? lista[0] : null;

            if (u != null)
            {
                if (Update(u, saltBytes, hash))
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            else
            {
                return(false);
            }
        }
        /// <summary>
        /// Brskanje baze po uporabniškem imenu
        /// </summary>
        /// <param name="uporabniskoIme">Brska se po parametru 'Uporabnik'</param>
        /// <returns>Eneg uporabnika ali prazno listo</returns>
        public static List <Uporabnik> Brskaj(int idUporabnika = -1, string uporabniskoIme = "")
        {
            SqlConnection con = new SqlConnection(Nastavitve.GetConnectionString());
            SqlCommand    cmd = new SqlCommand();

            string where = " 1 = 1 ";
            if (uporabniskoIme != "")
            {
                where += " AND (Uporabnik = '" + uporabniskoIme + "')";
            }
            if (idUporabnika != -1)
            {
                where += " AND (Id = " + idUporabnika + ")";
            }
            //                       0   1      2       3        4            5           6
            string select = "SELECT Id, Ime, Priimek, Email, Uporabnik, TipUporabnika, Kovanc " +
                            "FROM [StackDB].[dbo].[tblUporabnik] WHERE" + where;

            cmd.CommandText = select;
            cmd.Connection  = con;

            List <Uporabnik> lista = new List <Uporabnik>();

            try
            {
                con.Open();
                SqlDataReader reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    int           id          = reader.GetInt32(0);
                    string        ime         = reader.IsDBNull(1) ? "" : reader.GetString(1).Trim();
                    string        priimek     = reader.IsDBNull(2) ? "" : reader.GetString(2).Trim();
                    string        email       = reader.IsDBNull(3) ? "" : reader.GetString(3).Trim();
                    string        uporabnisko = reader.GetString(4).Trim();
                    TipUporabnika tip         = (TipUporabnika)reader.GetInt32(5);
                    int           kovanc      = reader.GetInt32(6);

                    Uporabnik uporabnik = new Uporabnik(id, ime, priimek, email, uporabnisko, tip, kovanc);
                    lista.Add(uporabnik);
                }
                reader.Close();
                return(lista);
            }
            catch (TimeoutException tEx)
            {
                // Zapisivanje u log
                return(null);
            }
            catch (Exception ex)
            {
                // log
                return(null);
            }
            finally
            {
                con.Close();
            }
        }
        /// <summary>
        /// Pridobivanje najboljših rezultatov
        /// </summary>
        /// <param name="velikostSeznama">Število rezultatov kateri se vrnejo</param>
        /// <returns></returns>
        public static List <TopRezultat> GetTopRezultati(int velikostSeznama)
        {
            SqlConnection con = new SqlConnection(Nastavitve.GetConnectionString());
            SqlCommand    cmd = new SqlCommand();

            if (velikostSeznama < 1)
            {
                velikostSeznama = 1;
            }

            string select = "SELECT TOP " + velikostSeznama +
                            //     0         1      2       3        4         5
                            " IdUporabnika, Ime, Priimek, Email, Uporabnik, Rezultat " +
                            "FROM [StackDB].[dbo].[viewRezultati] ORDER BY Rezultat DESC";

            cmd.CommandText = select;
            cmd.Connection  = con;

            List <TopRezultat> lista = new List <TopRezultat>();

            try
            {
                con.Open();
                SqlDataReader reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    int    id          = reader.GetInt32(0);
                    string ime         = reader.IsDBNull(1) ? "" : reader.GetString(1).Trim();
                    string priimek     = reader.IsDBNull(2) ? "" : reader.GetString(2).Trim();
                    string email       = reader.IsDBNull(3) ? "" : reader.GetString(3).Trim();
                    string uporabnisko = reader.IsDBNull(4) ? "" : reader.GetString(4).Trim();
                    int    rezultat    = reader.IsDBNull(5) ? -1 : reader.GetInt32(5);

                    Uporabnik   uporabnik   = new Uporabnik(id, ime, priimek, email, uporabnisko, 0, 0);
                    TopRezultat topRezultat = new TopRezultat(uporabnik, rezultat);

                    lista.Add(topRezultat);
                }
                reader.Close();
                return(lista);
            }
            catch (TimeoutException tEx)
            {
                // Zapisivanje u log
                return(null);
            }
            catch (Exception ex)
            {
                // log
                return(null);
            }
            finally
            {
                con.Close();
            }
        }
        /// <summary>
        /// Avtorizacija uporabnika
        /// </summary>
        /// <param name="idUporabnika">ID uporabnika kateroga preverjamo</param>
        /// <param name="novoGesloString">Geslo katero preverjamo če velja</param>
        /// <returns></returns>
        internal static bool?PotrdiGeslo(int idUporabnika, string novoGesloString)
        {
            Uporabnik u = Brskaj(idUporabnika)[0];

            byte[] novoGeslo = Encoding.UTF8.GetBytes(novoGesloString);
            byte[] geslo     = new byte[32];
            byte[] salt      = new byte[28];

            SqlConnection con = new SqlConnection(Nastavitve.GetConnectionString());
            SqlCommand    cmd = new SqlCommand();

            string select = "SELECT Geslo, Salt FROM [StackDB].[dbo].[tblUporabnik] WHERE Id = " + idUporabnika;

            cmd.CommandText = select;
            cmd.Connection  = con;

            try
            {
                con.Open();
                SqlDataReader reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    geslo = (byte[])reader["Geslo"];
                    salt  = (byte[])reader["Salt"];
                }
                reader.Close();
                byte[] noviHash = GenerateSaltedHash(novoGeslo, salt);
                if (CompareByteArrays(noviHash, geslo))
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            catch (TimeoutException tEx)
            {
                // Zapisivanje u log
                return(null);
            }
            catch (Exception ex)
            {
                // log
                return(null);
            }
            finally
            {
                con.Close();
            }
        }
        /// <summary>
        /// Update postoječih uporabnikov
        /// </summary>
        /// <param name="uporabnik">Objekt s uporabnikom kateroga hočemo spremeniti v bazi</param>
        /// <param name="salt">Opcionalni parameter kje se pohrani salt od uporabnikovog gesla</param>
        /// <param name="geslo">Opcionalni parameter z hashiranim geslom</param>
        /// <returns></returns>
        public static bool Update(Uporabnik uporabnik, byte[] salt = null, byte[] geslo = null)
        {
            SqlConnection con = new SqlConnection(Nastavitve.GetConnectionString());
            SqlCommand    cmd = new SqlCommand();

            string table = "[StackDB].[dbo].[tblUporabnik]";

            string where = " WHERE Id = " + uporabnik.Id;
            string update = "UPDATE " + table +
                            " SET Ime = '" + uporabnik.Ime + "', " +
                            "Priimek = '" + uporabnik.Priimek + "', " +
                            "Email = '" + uporabnik.Email + "', " +
                            "Uporabnik = '" + uporabnik.Uporabnisko + "', " +
                            "TipUporabnika = " + (int)uporabnik.Tip +
                            ", Kovanc = " + uporabnik.Kovanc;

            if (salt != null && geslo != null)
            {
                update += ", Salt = @Salt, Geslo = @Geslo";

                cmd.Parameters.Add("@Salt", SqlDbType.Binary);
                cmd.Parameters["@Salt"].Value = salt;

                cmd.Parameters.Add("@Geslo", SqlDbType.Binary);
                cmd.Parameters["@Geslo"].Value = geslo;
            }

            cmd.CommandText = update + where;
            cmd.Connection  = con;

            try
            {
                con.Open();
                cmd.ExecuteNonQuery();
                return(true);
            }
            catch (TimeoutException tEx)
            {
                // Zapisivanje u log
                return(false);
            }
            catch (Exception ex)
            {
                // log
                return(false);
            }
            finally
            {
                con.Close();
            }
        }
        /// <summary>
        /// Dodavanje novih uporabnikov
        /// </summary>
        /// <param name="uporabnik">Objekt s uporabnikom kateroga hočemo dodati v bazo</param>
        /// <returns>ID noveg uporabnika</returns>
        public static int Dodaj(Uporabnik uporabnik, string geslo)
        {
            SqlConnection con = new SqlConnection(Nastavitve.GetConnectionString());
            SqlCommand    cmd = new SqlCommand();

            string into   = "[StackDB].[dbo].[tblUporabnik]";
            string insert = "INSERT INTO " + into + " (Ime, Priimek, Email, Uporabnik, Geslo, Salt, TipUporabnika, Kovanc) " +
                            "VALUES (@Ime, @Priimek, @Email, @Uporabnik, @Geslo, @Salt, @TipUporabnika, @Kovanc); " +
                            "SELECT CAST(scope_identity() as int)";//'" + uporabnik.Ime + "', '" + uporabnik.Priimek + "', '" + uporabnik.Email + "', '" +

            //uporabnik.Uporabnisko + "', " + uporabnik.Tip + ", " + uporabnik.Kovanc;

            byte[] gesloBytes = Encoding.UTF8.GetBytes(geslo);
            byte[] saltBytes  = Encoding.UTF8.GetBytes(CreateSalt(20));
            byte[] gesloHash  = GenerateSaltedHash(gesloBytes, saltBytes);

            uporabnik.Parametriziraj(ref cmd, gesloHash, saltBytes);
            cmd.CommandText = insert;
            cmd.Connection  = con;

            try
            {
                con.Open();
                int?id = -1;
                id = (int?)cmd.ExecuteScalar();
                return((id != null) ? (int)id : -1);
            }
            catch (TimeoutException tEx)
            {
                // Zapisivanje u log
                return(-1);
            }
            catch (Exception ex)
            {
                // log
                return(-1);
            }
            finally
            {
                con.Close();
            }
        }
 public TopRezultat(Uporabnik uporabnik, int rezultat)
 {
     Uporabnik = uporabnik;
     Rezultat  = rezultat;
 }