import java.io.*;
import java.math.*;

public class BigIntegers {

  BigInteger[] biArray;
  BigInteger[] encodedBigIntegerArray;
  BigInteger bigInteger;

  String inputFileString;
  String[] inputFileAsTwentyCharStringArray;
  String decCharacterString;

  static BigInteger base;

  public BigInteger[] encode(String[] stringArrayToEncode) {

    System.out.println();

    byte[] byteArray;

    biArray = new BigInteger[inputFileAsTwentyCharStringArray.length];

    for(int i = 0; i < stringArrayToEncode.length - 1; i++) {

      byteArray = stringArrayToEncode[i].getBytes();
      bigInteger = new BigInteger(byteArray);
      biArray[i] = bigInteger;
    }

    return biArray;
  }


//
  //
  //
  //
  //

  public void printEncodedArrayToFile(BigInteger[] arrayToPrintToFile) {

    try {

      FileWriter fileWriter = new FileWriter("wacko.txt");
      BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);

      for (int i = 0; i < arrayToPrintToFile.length - 1; i++) {

        bufferedWriter.write(arrayToPrintToFile[i].toString(128));
        bufferedWriter.newLine();
      }

      bufferedWriter.close();
    }

    catch (IOException e) {

      System.out.println(e);
    }
  }

  static String[] divideInputFileStringArrayIntoTwentyCharStrings(
    String inputFileString) {

    int stringStart = 0;
    int stringEnd = 20;
    int arrayLength;

    if((inputFileString.length() % 20) > 0)
      arrayLength = ( (inputFileString.length()) / 20 + 2);
    else
      arrayLength = ((inputFileString.length()) / 20) + 1;

    System.out.println();

    String[] inputFileAsTwentyCharStringArray = new String[arrayLength];
    int inputFileAsTwentyCharStringArrayIndex = 0;

    while(stringStart < inputFileString.length()) {

      String tempSubString = inputFileString.substring(stringStart,stringEnd);
      stringStart += 20;

      if((stringEnd + 20) <= inputFileString.length())
        stringEnd += 20;
      else
        stringEnd = (inputFileString.length());

      inputFileAsTwentyCharStringArray[inputFileAsTwentyCharStringArrayIndex]
          = tempSubString;
      inputFileAsTwentyCharStringArrayIndex++;
    }

    return inputFileAsTwentyCharStringArray;
  }



  /*

      }


      }


   */

      public String decode() {

    byte[] byteArray;
    String decodedString = new String();

    try {

      FileReader fileReader = new FileReader("encoded.txt");
      BufferedReader bufferedReader = new BufferedReader(fileReader);

      BigInteger encodedBI;
      String currentLine;

      while ((currentLine = bufferedReader.readLine()) != null) {

        encodedBI = new BigInteger(currentLine);
        byteArray = encodedBI.toByteArray();

        for (int j = 0; j < byteArray.length; j++)
          decodedString += (char) byteArray[j];
      }

      bufferedReader.close();
    }

    catch (IOException e) {

      System.out.println(e);
    }

    return decodedString;
  }

  public void printbiArray(BigInteger[] arrayToPrint, String arrayToPrintName) {

    for(int i = 0; i < arrayToPrint.length - 1; i++)
      System.out.println(arrayToPrintName + "[" + i + "]: " +
                           arrayToPrint[i].toString(128));
  }

  public static void main(String argv[]) throws Exception {

    BigIntegers bigIntegers = new BigIntegers();
  }

  public BigIntegers() throws Exception {

    base = new BigInteger("128");

    inputFileString = loadinputFileString();

    System.out.println("\nOriginal String:\n\n" + inputFileString + "\n");

    inputFileAsTwentyCharStringArray =
        divideInputFileStringArrayIntoTwentyCharStrings(inputFileString);

    encodedBigIntegerArray = encode(inputFileAsTwentyCharStringArray);

    System.out.println("Encoded Array: \n");
    printbiArray(encodedBigIntegerArray, "encodedBigIntegerArray");

    printEncodedArrayToFile(encodedBigIntegerArray);

    decCharacterString = decode();
    System.out.println("\nDecoded String:\n\n" + decCharacterString + "\n");
  }

  static String loadinputFileString() throws Exception {

    FileReader fileReader = new FileReader("numbers.txt");
    BufferedReader bufferedReader = new BufferedReader(fileReader);

    String inputFileString = "";
    String currentLine;

    System.out.println();

    while((currentLine = bufferedReader.readLine()) != null) {

      inputFileString += currentLine;

      if(bufferedReader.ready())
        inputFileString += "\n";
    }

    return inputFileString;
  }


}
