import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;

public class HitungKata {
    public static void main(String[] args) {
        if (args.length == 1 && args[0].equals("--help")) {
            tampilkanBantuan();
            return;
        }
        if (args.length > 1) {
            System.err.println("Galat: terlalu banyak argumen.");
            System.err.println("Jalankan dengan --help untuk petunjuk.");
            System.exit(2);
        }

        try (BufferedReader pembaca = bukaSumber(args)) {
            long baris = 0, kata = 0, karakter = 0;
            String barisSekarang;
            while ((barisSekarang = pembaca.readLine()) != null) {
                baris++;
                karakter += barisSekarang.length();
                kata += hitungKata(barisSekarang);
            }
            System.out.printf("baris=%d kata=%d karakter=%d%n",
                    baris, kata, karakter);
        } catch (IOException e) {
            System.err.println("Galat: " + e.getMessage());
            System.exit(1);
        }
    }

    private static BufferedReader bukaSumber(String[] args) throws IOException {
        if (args.length == 1) {
            return Files.newBufferedReader(Path.of(args[0]), StandardCharsets.UTF_8);
        }
        return new BufferedReader(
                new InputStreamReader(System.in, StandardCharsets.UTF_8));
    }

    private static int hitungKata(String baris) {
        String rapat = baris.trim();
        return rapat.isEmpty() ? 0 : rapat.split("\\s+").length;
    }

    private static void tampilkanBantuan() {
        System.out.println("Nama:");
        System.out.println("  HitungKata - menghitung baris, kata, dan karakter");
        System.out.println();
        System.out.println("Penggunaan:");
        System.out.println("  java HitungKata.java [BERKAS]");
        System.out.println("  java HitungKata.java < MASUKAN.txt");
        System.out.println();
        System.out.println("Opsi:");
        System.out.println("  --help    tampilkan bantuan ini");
        System.out.println();
        System.out.println("Tanpa argumen, masukan dibaca dari standard input.");
        System.out.println("Keluaran selalu satu baris berformat baris=... kata=... karakter=...");
    }
}
