public class Opiskelija implements Comparable<Opiskelija> {
  private static int JUOKSEVA_OP_NRO = 1000000;
  private String etunimi;
  private String sukunimi;
  private int opiskelijaNro;
  private int koepisteet;
  private int harjoituspisteet;

  public Opiskelija(String etunimi, String sukunimi) {
    this.etunimi = etunimi;
    this.sukunimi = sukunimi;
    this.opiskelijaNro = JUOKSEVA_OP_NRO;
    JUOKSEVA_OP_NRO++;
  }

  // palauttaa etunimen
  public String annaEtunimi() {
    return etunimi;
  }

  // palauttaa sukunimen
  public String annaSukunimi() {
    return sukunimi;
  }

  public int annaOpiskelijaNro() {
    return opiskelijaNro;
  }

  public void asetaKoepisteet(int koepisteet) {
    this.koepisteet = annaTarkistetutPisteet(koepisteet);
  }

  public int annaKoePisteet() {
    return koepisteet;
  }

  public void asetaHarjoituspisteet(int harjoituspisteet) {
    this.harjoituspisteet = annaTarkistetutPisteet(koepisteet);
  }
  
  private int annaTarkistetutPisteet(int pisteet) {
    if (pisteet <= 0 && pisteet > 30) {
      return 0;
    }
    return pisteet;
  }

  public int annaHarjoituspisteet() {
    return harjoituspisteet;
  }

  @Override
  public String toString() {
    return (annaEtunimi() + " " + annaSukunimi() + " " + "("
        + annaOpiskelijaNro() + ")\nKoepisteet: " + annaKoePisteet()
        + "\nHarjoituspisteet: " + annaHarjoituspisteet() + "\nArvosana: " + annaArvosana());
  }

  public int annaArvosana() {
    int kokonaispisteet = this.koepisteet + this.harjoituspisteet;
    if (this.koepisteet <= 15 || kokonaispisteet <= 30) {
      return 0;
    }
    if (kokonaispisteet <= 35) {
      return 1;
    }
    if (kokonaispisteet <= 40) {
      return 2;
    }
    if (kokonaispisteet <= 45) {
      return 3;
    }
    if (kokonaispisteet <= 50) {
      return 4;
    }
    
    return 5;
  }

  public int vertaaArvosanaa(Opiskelija opiskelija) {
    if (this.annaArvosana() < opiskelija.annaArvosana()) {
      return 1;
    }
    if (this.annaArvosana() > opiskelija.annaArvosana()) {
      return -1;
    }
    return 0;
  }

  public int vertaaSukunimea(Opiskelija opiskelija) {
    return this.sukunimi.compareTo(opiskelija.sukunimi);
  }

  public int vertaaEtunimea(Opiskelija opiskelija) {
    return this.etunimi.compareTo(opiskelija.etunimi);
  }

  public int compareTo(Opiskelija opiskelija) {
    int vertaus = this.vertaaArvosanaa(opiskelija);
    if (vertaus != 0) {
      return vertaus;
    }
    vertaus = this.vertaaSukunimea(opiskelija);
    if (vertaus != 0) {
      return vertaus;
    }

    return this.vertaaEtunimea(opiskelija);
  }
}