:- module(nl,
          []).

:- multifile
    prolog:message//2,              % entire message
    prolog:error_message//2,        % 1-st argument of error term
    prolog:message_context//2,      % Context of error messages
    prolog:deprecated//2,	    % Deprecated features
    user:message_property/2.

% For the banner

prolog:message(nl, welcome) -->
    [ 'Welkom bij SWI-Prolog (' ],
    prolog:translate_message(threads),
    prolog:translate_message(address_bits),
    ['versie ' ],
    prolog:translate_message(version),
    [ ')', nl ],
    prolog:translate_message(copyright),
    [ nl ],
    prolog:translate_message(user_versions),
    [ nl ],
    prolog:translate_message(documentaton),
    [ nl, nl ].
prolog:message(nl, threads) -->
    (   {current_prolog_flag(threads, true)}
    ->  ['met draadjes, ']
    ;   []
    ).
prolog:message(nl, copyright) -->
    [ 'Er zit ABSOLUUT GEEN GARANTIE op SWI-Prolog.  Dit is vrije software.', nl,
      'Middels ', ansi(code, '?- license.', []), ' ziet u juridische details.', []
    ].
prolog:message(nl, documentaton) -->
    [ 'Hulp en achtergrond is te vinden op de website ',
      ansi(code, 'https://www.swi-prolog.org', []), nl,
      'Ingebouwde hulp is beschikbaar d.m.v. ',
      ansi(code, '?- help(Onderwerp).', []), ' of ',
      ansi(code, '?- apropos(Zoekstring).', [])
    ].

% e.g. ?- A is hallo.

prolog:error_message(nl, type_error(evaluable, Actual)) -->
    { callable(Actual) },
    [ 'Rekenen: `~p'' is geen functie'-[Actual] ].
prolog:error_message(nl, existence_error(procedure, Proc)) -->
    [ 'Onbekende procedure: ~q'-[Proc] ],
    unknown_proc_msg(Proc).

unknown_proc_msg(_:(^)/2) -->
    !,
    unknown_proc_msg((^)/2).
unknown_proc_msg((^)/2) -->
    !,
    [nl, '  ^/2 kan alleen gebruikt worden als tweede \c
            argument van setof/3 en bagof/3'].
unknown_proc_msg((:-)/2) -->
    !,
    [nl, '  Regels moeten van een bestand geladen worden'],
    faq('ToplevelMode').
unknown_proc_msg((=>)/2) -->
    !,
    [nl, '  Regels moeten van een bestand geladen worden'],
    faq('ToplevelMode').
unknown_proc_msg((:-)/1) -->
    !,
    [nl, '  Aanwijzingen moeten van een bestand geladen worden'],
    faq('ToplevelMode').
unknown_proc_msg((?-)/1) -->
    !,
    [nl, '  ?- is de Prolog prompt'],
    faq('ToplevelMode').
unknown_proc_msg(Proc) -->
    { '$messages':dwim_predicates(Proc, Dwims) },
    (   {Dwims \== []}
    ->  [nl, '  Echter, er zijn definities voor:', nl],
        '$messages':dwim_message(Dwims)
    ;   []
    ).

faq(Page) -->
    [nl, '  Zie FAQ at https://www.swi-prolog.org/FAQ/', Page, '.txt' ].

% e.g. ?- aap noot.

prolog:message_context(nl, string(String, CharPos)) -->
    { sub_string(String, 0, CharPos, _, Before),
      sub_string(String, CharPos, _, 0, After)
    },
    [ nl, '~w'-[Before], nl, '** hier **', nl, '~w'-[After] ].
prolog:message_context(nl, context(_, 'DWIM could not correct goal')) -->
    [ ' (DWIB kon uw doel niet repareren)' ].

% e.g. ?- set_prolog_stack(global, limit(10 000 000)).

prolog:deprecated(nl, set_prolog_stack(_Stack,limit)) -->
    [ 'set_prolog_stack/2: limit(Limiet) zet de gezamelijke limiet.'-[], nl,
      'Zie https://www.swi-prolog.org/changes/stack-limit.html'
    ].

user:message_property(error,   tag('FOUT')).
user:message_property(warning, tag('Waarschuwing')).
