// Autor: Martin Heinrich
// MatNr: 0125222
// BspNr: 3061
// Titel: Textbearbeitung (mit mehreren Strings)
// Beschreibung: Ein String wird umgebrochen und bestimmte Interpunktionsfehler korrigiert.
// Eingabe: Höchstens 10 Strings, anschließend ein String mit einer Breitenangabe
// Ausgabe: Der bearbeitete und umgebrochene String sowie Wortanzahl und Zahl der Abtrennungen
// Fehlermeldungen: "FALSCHE EINGABE" bei nicht korrigierbaren Eingabefehlern

// Die Bezeichnungen //[Ziffer][Buchstabe] beziehen sich auf die Dokumentation (Texte.txt)

import eprog.*; // Verwendung des EPROG-Packages

public class Texte extends EprogIO // Methoden der EprogIO können ohne Klassenangabe verwendet werden
{
  private static final String Numbers = "1234567890";
  private static final String msgValErr = "FALSCHE EINGABE"; // Fehlermeldung bei nicht korrigierbaren Eingabefehlern

  private static final int maxStrings = 10; // maximale Anzahl einzulesender Strings (exkl. Breitenangabe)
  private static final int maxWidth = 55; // maximale Zeilenbreite beim Umbrechen
  private static final int minWidth = 3; // minimale Zeilenbreite beim Umbrechen
  private static final int minPartOfWidth = 3; // minimale Zeilenbreite als Teil der Gesamtstringlänge

  private static Strings text = new Strings(); // enthält und bearbeitet die eingegebenen Strings
  private static int width; // enthält die Breite, bei der umgebrochen werden soll


//****************************************************************
  public static void main(String[] args)
  {
//1a
    if (getStrings() && // prüft maximale Anzahl Strings
       (width >= minWidth) && // ...minimale Zeilenbreite
       (width <= maxWidth) && // ...maximale Zeilenbreite
//1b
       (width <= text.getString().length()) &&
       (width >= (float)text.getString().length()/minPartOfWidth) && // ...relative Zeilenbreite
                 // Bei einer Ganzzahldivision wäre weder '>' noch '>=' immer richtig!
       (text.checkSpecifications()) && // s. Strings.java
       (text.forceLines(width))) // s. Strings.java
    {
      println(text.getString()); // Ausgabe des Textes
      println(text.getWordCount() + " " + text.getBreakCount()); // Ausgabe von Wortanzahl und Abtrennungen
    } else {println(msgValErr);}; // if (getStrings())
  } // main
//****************************************************************


//****************************************************************
  private static boolean getStrings()
  { // liest die Strings ein

    String tString; // Zwischenspeicher während der Eingabe
//2a
    try
    {
      for (int i = 0; i < maxStrings; i++)
      {
        tString = readWord();
        if (Numbers.indexOf(tString.charAt(0)) >= 0) // erstes Zeichen ist Ziffer
        {
          width = Integer.valueOf(tString).intValue(); // auslesen der Breitenangabe (innerhalb try!)
          return true;
        } else // erstes Zeichen ist nicht Ziffer  
        {  
          text.append(tString);
        }; // if (erstes Zeichen ist Ziffer)
      }; // for
      width = readInt(); // falls weitere Wörter eingegeben werden: Fehler
    } catch (Exception e) {return false;};
    return true;
  } // getStrings
//****************************************************************

} // Texte