import java.awt.Font;

/**
 * Balkendiagramm für int-Array, Zahlen werden aus CSV-Datei gelesen, Umwandlung in sortierte Tabelle.
 * Hinweis zur Benutzung: 
 * Start des Algorithmus: Klicke den Button "Was tut es?" an.
 * 
 * @author Schaller 
 * @version 29.11.18
 */
public class Highscore extends Picture

{
  // Liste mit allen Werten //<>//
  int[]    zahlen;    
  String[] namen;

  // Hilfsvariablen für die Suche
  int akt_maximum=-1;    // aktuell groesstes Element
  int akt=-2;            // aktuell untersuchtes Element
  int verzoegerung=1000;  // Geschwindigkeit der Ausführung

    // Schriften
  Font kleineSchrift;  
  Font grosseSchrift;

  public Highscore() {
    size(1000, 700);
    background(0);
    kleineSchrift = new Font( Font.SANS_SERIF, Font.PLAIN, 12 );
    grosseSchrift = new Font( Font.SANS_SERIF, Font.PLAIN, 20 );
    
    // CSV-Datei laden und anzeigen
    ladeTabelle("punkte.csv");
    
    zeichneBalken();
  }
  
  

  public void ladeTabelle(String name) {
    // Tabelle aus CSV-Datei laden //<>//
    Table csv = new Table(name, "header", ',', '"');
    
    if (csv != null  && csv.getColumnCount()==2) {
      
      // Initialisiere Arrays, in die alle Zeilen der Tabelle passen
      zahlen = new int[csv.getRowCount()];
      namen = new String[csv.getRowCount()];
      
      // Fülle die Arrays mit Werten aus der Tabelle
      for (int i = 0; i < zahlen.length; i++) {
        // Lies Wert aus der i. Zeile und der Spalte "Punkte" bzw. "Name"
        zahlen[i] = csv.getInt(i, "Punkte");
        namen[i] = csv.getString(i, "Name");
      }
    }
  }
  
 
  public void zeichneBalken() {
    
    clear();
    
    // Überschrift
    fill(255, 255, 255);
    textFont(grosseSchrift);
    text("Punkte", 2, 20);
    textFont(kleineSchrift);  
    
    // Alle Einträge darstellen
    if (zahlen != null) {
      for (int i = 0; i< zahlen.length; i++) {
        
        fill(20, 25, 165);
        // aktuelle Elemente farblich hervorheben
        if (i == akt || i == akt+1 ) {
          fill(140, 230, 20);
        } 
        
        // Balkendiagramm zeichnen
        if (zahlen[i]>=0) rect(120, 25+i*15, zahlen[i]+1, 13);
        
        // Beschriftung
        fill(255, 255, 255);
        text(namen[i], 2, 35+i*15);
        text(""+zahlen[i], 70, 35+i*15);
      }
    }
  }

  public void wastutes() {
    // Sind überhaupt Daten da?
    if (zahlen.length==0 ) {
      return;
    }
    
    
    //
    for (akt=0; akt+1 < zahlen.length; akt++) {
      //  
      zeichneBalken();
      delay(verzoegerung);
      // 
      if (zahlen[akt+1]> zahlen[akt]) {
        // 
        int dummy = zahlen[akt];
        zahlen[akt] = zahlen[akt+1];
        zahlen[akt+1] = dummy;
        
        // 
        zeichneBalken();
        delay(verzoegerung);
      }
    }
    
    // 
    akt = -2;
    zeichneBalken();
    delay(verzoegerung);
    
  }


 
  
  
  
  
  
}
