// GetLeaderboard returns a leaderboard object with the given Steam id
func GetLeaderboard(steamID int) (common.Leaderboard, error) {

	l, err := common.GetLeaderboardFromDB(steamID)

	// Now load entries
	// -- Update first
	ttl := time.Duration(24) * time.Hour
	if l.IsDaily() {
		ttl = time.Duration(30) * time.Minute
	}

	if l.LastUpdate.Add(ttl).Before(time.Now()) {
		loadLeaderboardFromWeb(l)
	}

	// -- Read from DB
	entries, err := common.GetEntriesFromDB(l.UID)

	if err != nil {
		return l, err
	}

	// ---------

	// Additionnal datas
	for i := 0; i < len(entries); i++ {
		entry := &entries[i]

		// Metadata
		t, err := hex.DecodeString(entry.MetadataRaw)

		if err == nil {
			if len(t) > 0 {

				// Metadata are 32 bits integer = 4 * 8 bits bytes
				metadatas := []int{}
				for m := 0; m < len(t); m += 4 {

					var val int32
					buf := bytes.NewBuffer(t[m : m+4])
					binary.Read(buf, binary.LittleEndian, &val)

					metadatas = append(metadatas, int(val))
				}

				specificFunctions.UseMetadata(entry, metadatas)
			}
		} else {
			common.Err("DATABASE", fmt.Sprintf("Error parsing metadata: %v", err))
		}
	}

	l.Entries = entries

	return l, nil
}
func loadLeaderboardsFromWeb() error {

	common.Info("LEADERBOARDS", "Reloading all leaderboards from web...")

	var ldbs common.LeaderboardsList

	// Parse new from URL
	url := fmt.Sprintf("http://steamcommunity.com/stats/%v/leaderboards/?xml=1", appID)

	// Get all leaderboards for the game
	if err := MakeAPICall(url, true, &ldbs); err != nil {
		common.Err("LEADERBOARDS", fmt.Sprintf("%s", err))
		return err
	}

	// Exclude some leaderboards we don't want to show
	for i := 0; i < len(excludedLeaderboardIDs); i++ {
		for j := 0; j < len(ldbs.List); j++ {
			if ldbs.List[j].SteamID == excludedLeaderboardIDs[i] {
				// Remove the element
				ldbs.List = append(ldbs.List[:j], ldbs.List[j+1:]...)
			}
		}
	}

	// Parse dates
	for i := 0; i < len(ldbs.List); i++ {
		l := &ldbs.List[i]

		l.LastUpdate = time.Date(1988, time.April, 29, 3, 0, 0, 0, time.UTC)
		l.Date = specificFunctions.GetDate(l)
	}

	// Save to database
	for _, l := range ldbs.List {

		// Exists?
		existingLeaderboard, _ := common.GetLeaderboardFromDB(l.SteamID)

		if existingLeaderboard.Name == "" {
			common.InsertLeaderboardDB(l)
		} else {
			common.UpdateLeaderboardDB(l)
		}
	}

	lastLeaderboardRefresh = time.Now()

	return nil
}