1:- module(ap_ui,
    2          [ banner/0,
    3            pause/0,
    4            prompt_string/3,
    5            prompt_number/5,
    6            prompt_choice/4,
    7            clear_screen/0
    8          ]).    9
   10:- use_module(library(readutil)).   11
   12banner :-
   13    format('~n', []),
   14    format('  █████  ANTISIPASI PEJABAT  █████~n', []),
   15    format('  Indonesian Civil Demonstration Risk Simulator~n', []),
   16    format('  v0.1.0.0  |  full SWI-Prolog  |  terminal~n', []),
   17    format('  "sebelum tiket makin bengkak" edition 💀~n', []),
   18    format('------------------------------------------------------------~n', []),
   19    format('Simulasi agregat. Bukan alat pengawasan individu / represi.~n~n', []).
   20
   21pause :-
   22    format('~nTekan ENTER untuk lanjut...', []), flush_output,
   23    read_line_to_string(user_input, _).
   24
   25prompt_string(Label, Default, Value) :-
   26    format('~w [~w]: ', [Label, Default]), flush_output,
   27    read_line_to_string(user_input, S0),
   28    normalize_space(string(S), S0),
   29    ( S == "" -> Value = Default ; Value = S ).
   30
   31prompt_number(Label, Min, Max, Default, Value) :-
   32    repeat,
   33      format('~w (~w-~w) [~w]: ', [Label, Min, Max, Default]), flush_output,
   34      read_line_to_string(user_input, S0), normalize_space(string(S), S0),
   35      ( S == "" -> Value = Default, !
   36      ; catch(number_string(N, S), _, fail), N >= Min, N =< Max -> Value=N, !
   37      ; format('Input harus angka ~w sampai ~w.~n', [Min, Max]), fail
   38      ).
   39
   40prompt_choice(Label, Options, DefaultIndex, Value) :-
   41    format('~n~w~n', [Label]),
   42    forall(member(I-_V-Text, Options), format('  [~w] ~w~n', [I, Text])),
   43    repeat,
   44      format('Pilih [~w]: ', [DefaultIndex]), flush_output,
   45      read_line_to_string(user_input, S0), normalize_space(string(S), S0),
   46      ( S == "" -> I=DefaultIndex
   47      ; catch(number_string(I, S), _, fail)
   48      ),
   49      ( memberchk(I-Value-_, Options) -> ! ; format('Pilihan tidak valid.~n', []), fail ).
   50
   51clear_screen :-
   52    ( current_prolog_flag(windows, true) -> shell('cls') ; shell('clear') ), !.
   53clear_screen