
// HighScores.java
// Andrew Davison, April 2005, ad@fivedots.coe.psu.ac.th


import java.io.*;
// import java.net.*;
import java.util.*;



public class HighScores
// Udržuje kolekcio nejvyšších bodů
{
  private ScoreInfo scores[];
  private int numScores;       // počet bodů v poli

  private static final int MAX_SCORES = 10;
  private static String SCORE_FN = "scores.txt";

  public HighScores()
  {
    scores = new ScoreInfo[MAX_SCORES];
    numScores = 0;
    loadScores();
  }


  public String toString()
  // Vrácený řetězec má tvar "HIGH$$ name1 & score1 & .... nameN & scoreN & "
  {
    String details = "HIGH$$ ";
    for(int i = 0; i < numScores; i++)
      details += scores[i].getName() + " & " + scores[i].getScore() + " & ";
    System.out.println("details: " + details);
    return details;
  }


  public void addScore(String line)
  // Řádek by měl mít tvar "name & score &"
  {
     StringTokenizer st = new StringTokenizer(line, "&");
     try {
       String name = st.nextToken().trim();
       int score = Integer.parseInt( st.nextToken().trim() );
       addScore(name, score);
       saveScores();    // po každé aktualizaci ulož
     }
     catch(Exception e)
     {  System.out.println("Problém při analýze nového skóre:\n" + e);  }
  }  // konec metody: addScore()



  public void addScore(String name, int scr)
  {
    int i = 0;

    while ((i < numScores) && (scores[i].getScore() >= scr))
      i++;

    if (i == MAX_SCORES) {   // pole je plné and new score is smaller than existing ones
      System.out.println("Score too small to be added to full array");
      return;      // nepřidávej nové skóre
    }

    if (numScores == MAX_SCORES)     // pole je plné, takže odeber nejmenší
      numScores--;
      
    // přesuň menší skóre v poli vpravo
    for(int j = numScores-1; j >= i; j--)
      scores[j+1] = scores[j];

    // přidej nové skóre
    scores[i] = new ScoreInfo(name, scr);

    numScores++;
  }  // konec metody: addScore()



  private void loadScores()
  /* Předpokládáme skóre sestávající z řetězce "name & score &" na 
     řádku. Skóre se čte ze souboru SCORE_FN.
  */
  {
    String line;
    try {
      BufferedReader in = 
			new BufferedReader(new FileReader(SCORE_FN));
      while ((line = in.readLine()) != null)
        addScore(line);
      in.close();
    }
    catch(IOException e)
    {  System.out.println(e);  }
  }  // konec metody: loadScores()


  public void saveScores()
  /* Na každý řádek souboru SCORE_FN zapíše "name & score &".
  */
  {
    String line;
    try {
      PrintWriter out = new PrintWriter(
			new BufferedWriter( new FileWriter(SCORE_FN) ), true);
      for (int i=0; i < numScores; i++) {
         line = scores[i].getName() + " & " + scores[i].getScore() + " &";
         out.println(line);
      }
      out.close();
    }
    catch(IOException e)
    {  System.out.println(e);  }
  }  // konec metody: saveScores()


}  // konec třídy: HighScores



// --------------------------------------------------------------

class ScoreInfo
// Udržuje údaje o jménu a skóre
{
  private String name;
  private int score;

  public ScoreInfo(String n, int s)
  {  name = n;  score = s;  }

  public String getName()
  {  return name;  }

  public int getScore()
  {  return score;  }

}  // konec třídy: ScoreInfo

