/*
Uno studio medico ha 100 pazienti.
Per ogni paziente si mantiene una informazione sulla età (tra 14 e 90) e
sulle iniziali dei loro nomi e cognomi (due caratteri).

Assegnando a caso i dati relativi ai pazienti, si vuole un programma JAVA che consenta di sapere
a)    i dati completi del paziente più anziano;
b)     quanti pazienti hanno iniziali assegnate e superano una certa età.
Le iniziali e la età sono inserite con un dialogo interattivo da parte dell’utente.
*/
import javax.swing.JOptionPane;

class Paziente {
  private int eta;
  private String iniziali;
  //costruttore
  public Paziente() {
    //inizializzo il paziente casualmente
    eta = (int)(Math.random()*(90-14+1)+14);
    iniziali = String.valueOf(letteracasuale()).
               concat(String.valueOf(letteracasuale()));
  }
  //membro privato
  private char letteracasuale() {
    //estrae una lettera casuale tra A e Z
    return (char)((int)(Math.random()*26+65));
  }
  
  //metodi pubblici
  public String toString() {
    return ("Paziente '" + iniziali + "' eta': " + eta);
  }
  
  public String getIniziali() {return iniziali;}
  public int getEta() {return eta;}
}

class Studio {
  //collezione di pazienti
  private Paziente[] pazienti;
  //membri privati
  private int numpazienti;
  private final int DEFAULT = 100;
  //costruttori: ne faccio 2 (è più professionale)
  public Studio() {
    //#1. Nessun parametro, crea uno studio di default
    numpazienti = DEFAULT;
    creaPazienti();
  }
  public Studio(int numpazienti) {
    //#2. un parametro, crea uno studio con num di paz. specificato.
    this.numpazienti = numpazienti;
    creaPazienti();
  }
  
  //crea i pazienti (usato dai costruttori)
  private void creaPazienti() {
    pazienti = new Paziente[numpazienti];
    for (int c=0; c<numpazienti; c++)
      pazienti[c] = new Paziente();
  }

  //membri pubblici
  public int getNumPazienti() {return numpazienti;}
  
  //restituisce il riferimento ad un singolo paziente  
  public Paziente getPaziente(int n) {return pazienti[n];}
  
  //restituisce il paziente più anziano
  public Paziente getAnziano() {
    int max = 0, item = 0;
    for (int c=0; c<numpazienti; c++)
      if (pazienti[c].getEta() > max) {
        max = pazienti[c].getEta();
        item = c;
      }
    return pazienti[item];
  }
  
  //restituisce numero di pazienti che hanno iniziali specificate e > di eta  
  public int cercaPazienti(String iniziali, int eta) {
    int count=0;
    //determina quanti sono
    for (int c=0; c<numpazienti; c++) {
      if (pazienti[c].getIniziali().equals(iniziali) && pazienti[c].getEta()>eta) count++;
    }
    return count;
  }
    
}


public class StudioMedico {
  public static void main(String[] args) {
    //Crea Studio medico con costruttore di default (100 pazienti)
      Studio sm = new Studio(10);
    for (;;) {
      //Mostra i pazienti
        String out = "Studio medico di " + sm.getNumPazienti() + " pazienti.\nElenco:\n";
        for (int c=0; c<sm.getNumPazienti(); c++)
          out += (c+1) + " " + sm.getPaziente(c) + "\n";
      //Mostra più anziano
        out += "\nIl paziente più anziano e' " + sm.getAnziano();
        JOptionPane.showMessageDialog(null, out);
        String iniz="";
        int eta;
        try {   //previene errori nell'input dell'utente
          do {  //le iniziali devono essere DUE!
            iniz = JOptionPane.showInputDialog("Inserisci Iniziali Paziente (solo 2 lettere)");
          } while (iniz.length() != 2);
          eta = Integer.parseInt(JOptionPane.showInputDialog("Inserisci età (0k per uscire)"));
        } catch (Exception e) {eta=0;}
        if (eta==0) break;
      //Mostra ricerca
        JOptionPane.showMessageDialog(null, "I pazienti con iniziali '"+iniz.toUpperCase()
                   +"' e maggiori di "+eta+" anni sono: " +
                    sm.cercaPazienti(iniz.toUpperCase(), eta));
    }
      System.exit(0);
      
  }
}