:- module(split_qualified_label, []).

:- use_module(library(settings)).
:- use_module(library(semweb/rdf11)).
:- use_module(library(amalgame/ag_strategy)).
:- use_module(library(amalgame/vocabulary)).
:- use_module(library(ag_modules/string_match_util)).

:- setting(amalgame:split_qualified_labels, boolean, true,
        "Add additional term/qualifier properties for qualified labels").

splitted_labels_graph('http://localhost/amalgame/splitted_labels_graph').

:- multifile
	amalgame:prebuilder/1.

:- rdf_meta
    label_labelxl(r,r).

% Call split_qualified_labels on all vocabularies in Strategy.
amalgame:prebuilder(Strategy) :-
    forall(strategy_vocabulary(Strategy, Vocab),
           split_qualified_labels(Vocab)
          ).

%!  label_labelxl(?Property, ?PropertyXL) is det.
%
%   PropertyXL is the SKOS XL version of Property, or
%   amalgame:label if not applicable.

label_labelxl(skos:prefLabel, skosxl:prefLabel) :- !.
label_labelxl(skos:altLabel, skosxl:altLabel)   :- !.
label_labelxl(_, amalgame:label) :- !.


%!  split_qualified_labels(+Vocab) is det.
%
%   Calls split_qualified_labels/1 on all concepts in Vocab.
split_qualified_labels(Vocab) :-
    forall(vocab_member(Concept, Vocab),
           split_qualified_label(Concept)
          ).

%!  split_qualified_label(+Concept) is det.
%
%   If Concept has a qualified label in the format
%   "Term (Qualifier)"@Lang, a bnode is added with properties
%   amalgame:term Term@Lang and
%   amalgame:qualifier Qualifier@Lang
%
%   If such as bnode already exists, this predicate succeeds without
%   adding any triples.

split_qualified_label(Concept) :-
    % Check if not already splitted into a bnode with term (qualifier)
    rdf_has(Concept, amalgame:label, LiteralObject),
    rdf_is_bnode(LiteralObject),
    rdf(LiteralObject, amalgame:term, _),
    !.

split_qualified_label(Concept) :-
    skos_has(Concept, amalgame:label, Label@Lang, MatchProp, []),
    (   sub_string(Label, Before, _, _, "(")
    ->  sub_string(Label, 0, Before, _, LabelTermPaddded),
        split_string(LabelTermPaddded, "", " ", [LabelTerm]),
        split_string(Label, "()", " ", [LabelTerm, Qualifier, ""]),
        splitted_labels_graph(Graph),
        rdf_create_bnode(LiteralObject),
        label_labelxl(MatchProp, MatchPropXL),
        rdf_assert(Concept, MatchPropXL, LiteralObject, Graph),
        rdf_assert(LiteralObject, amalgame:term, LabelTerm@Lang, Graph),
        rdf_assert(LiteralObject, amalgame:qualifier, Qualifier@Lang, Graph)
    ;   true).