public class Lotto {

  private static final int NRUOTE = 6;
  private static final int NESTRAZIONI = 5;
  private static final int SUPERENALOTTO = 5;

  private int[][] estrazioni;

  public Lotto() {
    estrazioni = new int[NRUOTE][NESTRAZIONI];
    for (int r = 0; r < NRUOTE; r++)
      for (int e = 0; e < NESTRAZIONI; e++)
        estrazioni[r][e] = nuovoEstratto(estrazioni[r], e);
  }

  // genera un numero casuale tra 1 e 90 non presente tra i primi numEstratti
  // dell'array giaEstratti
  private static int nuovoEstratto(int[] giaEstratti, int numEstratti) {
    int n = 0;
    boolean nuovo = false;
    while (!nuovo) {
      n = (int) (Math.random() * 90) + 1;
      nuovo = true;
      for (int i = 0; i < numEstratti; i++)
        if (giaEstratti[i] == n) nuovo = false;
    }
    return n;
  }


  public String verifica(int[] giocata) {
    if (!giocataValida(giocata))
      return "giocata invalida";
    else {
      String[] vincite = { "ambo", "terna", "quaterna", "cinquina" };
      for (int r = 0; r < estrazioni.length; r++) {
        int conta = 0;
        for (int g = 0; g < giocata.length; g++)
          if (presente(giocata[g], estrazioni[r])) conta++;
        if (conta == giocata.length) return vincite[conta-2];
      }
      return "nulla";
    }
  }

  private static boolean giocataValida(int[] giocata) {
    if (giocata.length < 2 || giocata.length > 5)
      return false;
    else {
      for (int i = 0; i < giocata.length; i++)
        for (int j = i+1; j < giocata.length; j++)
          if (giocata[i] == giocata[j]) return false;
      return true;
    }
  }

  private static boolean presente(int numero, int[] numeri) {
    for (int i = 0; i < numeri.length; i++)
      if (numero == numeri[i]) return true;
    return false;
  }


  public boolean superEnalotto(int[] giocata) {
    if (!giocataSuperEnalottoValida(giocata))
      return false;
    else {
      int[] vincenti = superEnalottoVincenti(estrazioni);
      for (int i = 0; i < giocata.length; i++)
        if (!presente(giocata[i], vincenti)) return false;
      return true;
    }
  }


  // verifica se la giocata al SuperEnalotto e' valida, ovvero e' costituita da
  // SUPERENALOTTO numeri tutti distinti
  private static boolean giocataSuperEnalottoValida(int[] giocata) {
    if (giocata.length != SUPERENALOTTO)
      return false;
    else
      return giocataValida(giocata);
  }

  // calcola gli NRUOTE numeri vincenti del SuperEnalotto; i numeri vincenti
  // sono dati dal primo numero estratto da ciascuna ruota che sia diverso da
  // tutti i numeri vincenti presi dalle ruote precedenti
  private static int[] superEnalottoVincenti(int[][] estrazioni) {
    int[] vincenti = new int[estrazioni.length];
    for (int r = 0; r < vincenti.length; r++) {
      int e = 0;
      while (e < estrazioni[r].length && presente(estrazioni[r][e], vincenti))
        e++;
      vincenti[r] = estrazioni[r][e];
    }
    return vincenti;
  }


  // funzionalita` addizionale rispetto a quanto chiesto dalle specifiche
  // overriding del metodo toString di Object, per poter verificare i numeri
  // generati
  public String toString() {
    String ris = "";
    for (int r = 0; r < estrazioni.length; r++) {
      for (int e = 0; e < estrazioni[0].length; e++)
        ris = ris + estrazioni[r][e] + " ";
      ris = ris + "\n";
    }
    return ris;
  }
}
