Progress bar: show expected finish time (and date)

- Display 'done ~HH:mm' for same-day completion
- Display 'done ~DOW MM-dd HH:mm' when finish is on a future day
- Increase render interval from 100ms to 1000ms
- Also fixes left-over characters at bnthe line end

Change-Id: I7d79de3017aa22d5dfb27685d3141e8b1764b194
diff --git a/src/main/java/de/ids_mannheim/korap/index/Indexer.java b/src/main/java/de/ids_mannheim/korap/index/Indexer.java
index 952b120..50aa5e1 100644
--- a/src/main/java/de/ids_mannheim/korap/index/Indexer.java
+++ b/src/main/java/de/ids_mannheim/korap/index/Indexer.java
@@ -9,6 +9,8 @@
 import java.util.Enumeration;
 import java.util.Properties;
 import java.util.Locale;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.zip.ZipEntry;
@@ -746,7 +748,7 @@
             while (running && !finished) {
                 render();
                 try {
-                    Thread.sleep(100);
+                    Thread.sleep(1000);
                 }
                 catch (InterruptedException e) {
                     // ignore
@@ -774,7 +776,7 @@
                 double elapsedSec = (now - startTimeMs) / 1000.0;
                 double rateMBs = elapsedSec > 0 ? current / 1_000_000.0 / elapsedSec : 0.0;
                 String rateStr = rateMBs > 0 ? String.format(Locale.US, "%.2f MB/s", rateMBs) : "NA";
-                String line = String.format(Locale.US, "\r[%s]   %.1f MB processed | %s | ETA calculating...", bar, current / 1_000_000.0, rateStr);
+                String line = String.format(Locale.US, "\r[%s]   %.1f MB processed | %s | ETA calculating...\033[K", bar, current / 1_000_000.0, rateStr);
                 System.err.print(line);
                 return;
             }
@@ -791,13 +793,27 @@
             double rateBytesPerSec = elapsedSec > 0 ? current / elapsedSec : 0.0;
             long etaSec = (rateBytesPerSec > 0 && total > current) ? (long) Math.ceil((total - current) / rateBytesPerSec) : 0;
 
-            String etaStr = (rateBytesPerSec > 0) ? Indexer.formatDuration(etaSec) : "NA";
+            String etaStr;
+            String finishAt;
+            if (rateBytesPerSec > 0) {
+                etaStr = Indexer.formatDuration(etaSec);
+                LocalDateTime now2 = LocalDateTime.now();
+                LocalDateTime finishTime = now2.plusSeconds(etaSec);
+                if (finishTime.toLocalDate().equals(now2.toLocalDate())) {
+                    finishAt = finishTime.format(DateTimeFormatter.ofPattern("HH:mm"));
+                } else {
+                    finishAt = finishTime.format(DateTimeFormatter.ofPattern("EEE MM-dd HH:mm", Locale.US));
+                }
+            } else {
+                etaStr = "NA";
+                finishAt = "?";
+            }
             String pctStr = String.format(Locale.US, "%5.1f%%", percent * 100.0);
             String rateStr = String.format(Locale.US, "%.2f MB/s", rateBytesPerSec / 1_000_000.0);
             double processedMB = current / 1_000_000.0;
             double totalMB = total / 1_000_000.0;
 
-            String line = String.format(Locale.US, "\r[%s] %s %.1f/%.1f MB | %s | ETA %s", bar, pctStr, processedMB, totalMB, rateStr, etaStr);
+            String line = String.format(Locale.US, "\r[%s] %s %.1f/%.1f MB | %s | ETA %s (done ~%s)\033[K", bar, pctStr, processedMB, totalMB, rateStr, etaStr, finishAt);
             System.err.print(line);
         }
     }