/**
 * Title:        Pommeja taivaalta
 * Description:  Geneerinen räiskintäpeli Javalla
 * Copyright:    Copyright (c) 2003
 *
 * @author Juho Makkonen
 * @version 1.0
 */


import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.Reader;
import java.text.ParseException;
import java.util.StringTokenizer;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;


/**
 * Luokka <code>ParhaatTulokset</code> on komponentin
 * <code>JPanel</code> laajennus. Luokan olio on
 * <code>JLabel</code> -komponenteista muodostettu
 * taulukko, joka näyttää 10 parasta tulosta.
 */
public class ParhaatTulokset extends JPanel {

    /** Luokkakohtainen vakio rivien määrä. */
    private static final int RIVIMAARA = 10;

    /** Luokkakohtainen vakio sarakkeiden määrä. */
    private static final int SARAKEMAARA = 6;
  
    /** Kapseloi taulukon solun koon. */
    private Dimension dimensio;

    /** Sen tiedoston nimi, josta tulokset ladataan. */
    private String tiedostonNimi;

    /** Binaarivirta tiedostosta lukemista varten. */
    private InputStream in = null;

    /** Merkkivirta, joka lukee merkit binaarivirrasta. */
    private Reader lukija = null;

    /** Puskurivirta. */
    private BufferedReader blukija = null;


    /**
     * Luo uuden taulukon.
     *
     * @throws IOException jos tiedostosta lukeminen ei onnistu
     * @param tiedostonNimi sen tiedoston nimi, josta luetaan
     */
    public ParhaatTulokset(String tiedostonNimi) throws IOException {

	// Ominaismuuttujan <code>tiedostonNimi</code> arvoksi
	// parametrina annettu tiedostonnimi.
	this.tiedostonNimi = tiedostonNimi;

	// Asetetaan taulukon koko.
	this.setSize(625,200);

	// Asetetaan taulukon asettelijaksi <code>GridBagLayout</code>
	GridBagLayout asettelija = new GridBagLayout();
	this.setLayout(asettelija);

	// Asetetaan sarakkeiden otsikot.
	String sarakeOtsikot[] = {" Sijoitus"," Nimi"," Suoritusajankohta",
				     " Pelin kesto"," Tuhotut pommit"," Pisteet"};

	// Alustetaan taulukon solujen koko.
	dimensio = new Dimension(100,20);

	// Lisätään sarakeotsikot.
	for (int i=0;i<sarakeOtsikot.length;i++) {
	    
	    // Jokainen otsikko on <code>JLabel</code> -olio.
	    JLabel otsikko = new JLabel(sarakeOtsikot[i]);

	    // Kolmas sarake asetetaan muita leveämmäksi.
	    if (i == 2) {
		otsikko.setPreferredSize(new Dimension(125,20));
	    } else {
		otsikko.setPreferredSize(dimensio);
	    }

	    // Taustaväriksi harmaa.
	    otsikko.setBackground(new Color(240,240,240));

	    // Yhden yksikön levyinen musta reunus.
	    otsikko.setBorder(BorderFactory.createMatteBorder(1,1,1,1,Color.black));

	    // Lisätään otsikko taulukkoon.
	    this.add(otsikko, new GridBagConstraints
		     (i,0,1,1,0.0,0.0,GridBagConstraints.CENTER,
		      GridBagConstraints.NONE, new Insets(0,0,0,0),0,0));

	}

	// Alustetaan binaarivirta.
	in = new FileInputStream(tiedostonNimi);
	
	// Alustetaan merkkivirta.
	lukija = new InputStreamReader(in);

	// Puskuroidaan luotu merkkivirta.
	blukija = new BufferedReader(lukija);

	// Luetaan rivejä, kunnes päästään loppuun.
	String rivi = null;
	for (int m=1;(rivi=blukija.readLine()) != null && m<11;m++) {

	    // Pätkitään rivit osiin, luodaan osista taulukon
	    // soluja vastaavalla tavalla kuin luotiin otsikkosolut
	    // ja lisätään solut taulukkoon.
	    StringTokenizer st = new StringTokenizer(rivi,"&");
	    if (st.hasMoreTokens()) {

		JLabel sijoitus = new JLabel(" " + m + ".");
		sijoitus.setPreferredSize(dimensio);
		sijoitus.setBackground(Color.white);
		sijoitus.setOpaque(true);
		sijoitus.setBorder(BorderFactory.createMatteBorder(1,1,1,1,Color.black));
		this.add(sijoitus, new GridBagConstraints
			 (0,m,1,1,0.0,0.0,GridBagConstraints.CENTER,
			  GridBagConstraints.NONE, new Insets(0,0,0,0),0,0));

		JLabel nimi = new JLabel(" " + st.nextToken());
		nimi.setPreferredSize(dimensio);
		nimi.setBackground(Color.white);
		nimi.setOpaque(true);
		nimi.setBorder(BorderFactory.createMatteBorder(1,1,1,1,Color.black));
		this.add(nimi, new GridBagConstraints
			 (1,m,1,1,0.0,0.0,GridBagConstraints.CENTER,
			  GridBagConstraints.NONE, new Insets(0,0,0,0),0,0));

		JLabel paiva = new JLabel(" " + st.nextToken());
		paiva.setPreferredSize(new Dimension(125,20));
		paiva.setBackground(Color.white);
		paiva.setOpaque(true);
		paiva.setBorder(BorderFactory.createMatteBorder(1,1,1,1,Color.black));
		this.add(paiva, new GridBagConstraints
			 (2,m,1,1,0.0,0.0,GridBagConstraints.CENTER,
			  GridBagConstraints.NONE, new Insets(0,0,0,0),0,0));

		// Luettua peliaikaa pitää muokata, ennen kuin se kelpuutetaan taulukkoon.
		int peliaika = Integer.parseInt(st.nextToken());
		int pelisekunnit = peliaika % 60;
		int peliminuutit = ((peliaika - pelisekunnit)/60);
		JLabel aika;		
		if (peliminuutit < 0) {
		    aika = new JLabel(" 0 min " + pelisekunnit + " sek");
		} else {
		    aika = new JLabel(" " + peliminuutit + " min " + pelisekunnit + " sek");
		}
		aika.setPreferredSize(dimensio);
		aika.setBackground(Color.white);
		aika.setOpaque(true);
		aika.setBorder(BorderFactory.createMatteBorder(1,1,1,1,Color.black));
		this.add(aika, new GridBagConstraints
			 (3,m,1,1,0.0,0.0,GridBagConstraints.CENTER,
			  GridBagConstraints.NONE, new Insets(0,0,0,0),0,0));
	
		JLabel tuhotutpommit = new JLabel(" " + st.nextToken());
		tuhotutpommit.setBorder(BorderFactory.createMatteBorder(1,1,1,1,Color.black));
		tuhotutpommit.setPreferredSize(dimensio);
		tuhotutpommit.setBackground(Color.white);
		tuhotutpommit.setOpaque(true);
		this.add(tuhotutpommit, new GridBagConstraints
			 (4,m,1,1,0.0,0.0,GridBagConstraints.CENTER,
			  GridBagConstraints.NONE, new Insets(0,0,0,0),0,0));

		JLabel pisteet = new JLabel(" " + st.nextToken());
		pisteet.setBorder(BorderFactory.createMatteBorder(1,1,1,1,Color.black));
		pisteet.setPreferredSize(dimensio);
		pisteet.setBackground(Color.white);
		pisteet.setOpaque(true);
		this.add(pisteet, new GridBagConstraints
			 (5,m,1,1,0.0,0.0,GridBagConstraints.CENTER,
			  GridBagConstraints.NONE, new Insets(0,0,0,0),0,0));

		// Jos rivillä on vielä lisää osia, se tarkoittaa, että kyseessä
		// on pelaajan rivi. Värjätään rivin solujen tekstit punaisiksi.
		if (st.hasMoreTokens()) {
		    sijoitus.setForeground(Color.red);
		    nimi.setForeground(Color.red);
		    paiva.setForeground(Color.red);
		    aika.setForeground(Color.red);
		    tuhotutpommit.setForeground(Color.red);
		    pisteet.setForeground(Color.red);
		}
 		    
	    }

	}

	// Suljetaan virta.
	if (blukija != null) {
	    blukija.close();
	}
   
    }	

}

