@prefix adms: <http://www.w3.org/ns/adms#> .
@prefix dbo: <https://dbpedia.org/ontology/> .
@prefix dct: <http://purl.org/dc/terms/> .
@prefix locn: <http://www.w3.org/ns/locn#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix rr: <http://www.w3.org/ns/r2rml#> .
@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix legal: <http://www.w3.org/ns/legal#> .
@prefix m8g: <http://data.europa.eu/m8g/> .

######## D2RML NAMESPACES ###########

@prefix dr: <http://islab.ntua.gr/ns/d2rml#> .
@prefix drop: <http://islab.ntua.gr/ns/d2rml-op#> .
@prefix dris: <http://islab.ntua.gr/ns/d2rml-is#> .

######## STIRDATA TMP NAMESPACES ###########

@prefix nuts-item: <http://data.europa.eu/nuts/code/> .
@prefix lau-item: <https://w3id.org/stirdata/resource/lau/item/> .

@prefix sd-voc: <https://w3id.org/stirdata/vocabulary/> .
@prefix sd-voc-adminlevel: <https://w3id.org/stirdata/resource/adminUnitLevel/> .

@prefix sd-agency-nl: <http://nl.data.stirdata.eu/resource/agency/> .
@prefix sd-organization-nl: <http://nl.data.stirdata.eu/resource/organization/> .
@prefix sd-unit-nl: <http://nl.data.stirdata.eu/resource/unit/> .
@prefix sd-site-nl: <http://nl.data.stirdata.eu/resource/site/> .
@prefix sd-address-nl: <http://nl.data.stirdata.eu/resource/address/> .
@prefix sd-identifier-nl: <http://nl.data.stirdata.eu/resource/identifier/> .

@prefix sd-companytype-item-nl: <http://nl.data.stirdata.eu/resource/companyType/item/> .
@prefix sd-companystatus-item-nl: <http://nl.data.stirdata.eu/resource/companyStatus/item/> .

@prefix sd-nace-item-nl:    <http://nl.data.stirdata.eu/resource/nace/sbi2008/item/> .

######## EXECUTION ORDER ###########

<#Order>
   a dr:LogicalDatasetOrder ;
   dr:logicalDatasets ( 
#                        <#CitiesMapping>
                        <#OrganizationsMapping> 
						) .

######## DATA SOURCES ###########


<#CountriesSource>
   a dris:HTTPSource ;
   dris:cacheable true ;
   dris:uri "https://stirdata-semantic.ails.ece.ntua.gr/api/content/index/countries/search?text={@@TEXT@@}&keys=label,alt-label&type=match-phrase&fields=label,nal,alpha2" .
   
<#PostCodeSource>
   a dris:HTTPSource ;
   dris:cacheable true ;
   dris:uri "https://apps.islab.ntua.gr/geo/api/postcode?country-code={@@COUNTRY@@}&postcode={@@POSTCODE@@}" .
   
<#NutsSource>    
   a dris:HTTPSource ;
   dris:cacheable true ;
   dris:uri "https://stirdata-semantic.ails.ece.ntua.gr/api/content/index/nuts/search?text={@@TEXT@@}&keys=notation&type=match&fields=label" .

<#BussinessRegistryOpenDataSource>
   a dris:HTTPSource ;
   dris:uri "https://static.kvk.nl/download/kvk-open-data-set-handelsregister.zip" ;
   dris:inContainerPath "*" .   
#   a dris:FileSource ;
#   dris:path "d:/data/stirdata/data/nl/kvk-open-data-set-handelsregister.csv" .

######## TRANSFORMATIONS ###########

<#CountryTransformation>
   dr:logicalArray [ 
      a dr:JSONItemArray ;
      dr:source <#CountriesSource> ;
	  dr:iterator "$";
      dr:limit 1;
   ] .
   
<#PostCodeTransformation>
   dr:logicalArray [ 
      a dr:JSONItemArray ;
      dr:source <#PostCodeSource> ;
	  dr:iterator "$";
	  dr:limit 1;
   ] . 

<#NutsTransformation>
   dr:logicalArray [ 
      a dr:JSONItemArray ;
      dr:source <#NutsSource> ;
	  dr:iterator "$";
	  dr:limit 1;
   ] . 

######## AUXILIARY SOURCE ###########

<#AdminLevelModel>
    a dris:AuxiliaryModel .
	
	
<#OrganizationsMapping>
#    Woonplaats
#    Indicatie Hoofdvestiging
# ++ Rechtsvorm
# -- Rechtsvorm omschrijving
# ++ Hoofdactiviteit
# -- Omschrijving hoofdactiviteit
# ++ Nevenactiviteit 1
# -- Omschrijving nevenactiviteit 1
# ++ Nevenactiviteit 2
# -- Omschrijving nevenactiviteit 2
#    Import
#    Export
# ++ Datum oprichting
#    Datum akte oprichting
# ++ Datum Inschrijving
#    Datum vestiging
#    Datum vestiging huidig adres
#    Datum opheffing
#    Datum voortzetting
#    Indicator surseance - faillissement - schuldsanering
#    boekjaar
#    Datum deponering jaarstuk

   rr:logicalTable [ 
      a dr:CSVTable;
      dr:source <#BussinessRegistryOpenDataSource> ;
      dr:delimiter ",";
      dr:quoteCharacter "\"" ;
      dr:headerRecord true ;
#      dr:offset 1 ;
#      dr:limit 5;
   ] ;

   dr:definedColumns ( [
      dr:name "UUID" ;
      dr:function drop:uuid ; 
   ] [
      dr:name "ESTABLISHMENT_DATE_SPLIT" ;
      dr:function drop:extractMatch ; 
      dr:parameterBinding [ 
         dr:parameter "input" ;
         rr:column "Datum oprichting" ;   
      ] ;
      dr:parameterBinding [ 
         dr:parameter "regex" ;
         rr:constant "^(\\d{4})(\\d{2})(\\d{2})$"  ;
      ] ; 
   ] [
      dr:name "REGISTRATION_DATE_SPLIT" ;
      dr:function drop:extractMatch ; 
      dr:parameterBinding [ 
         dr:parameter "input" ;
         rr:column "Datum Inschrijving" ;   
      ] ;
      dr:parameterBinding [ 
         dr:parameter "regex" ;
         rr:constant "^(\\d{4})(\\d{2})(\\d{2})$"  ;
      ] ; 
   ] [
      dr:name "BUSSINESS_START_DATE_SPLIT" ;
      dr:function drop:extractMatch ; 
      dr:parameterBinding [ 
         dr:parameter "input" ;
         rr:column "Datum vestiging" ;   
      ] ;
      dr:parameterBinding [ 
         dr:parameter "regex" ;
         rr:constant "^(\\d{4})(\\d{2})(\\d{2})$"  ;
      ] ; 
   ] [
      dr:name "DEREGISTRATION_DATE_SPLIT" ;
      dr:function drop:extractMatch ; 
      dr:parameterBinding [ 
         dr:parameter "input" ;
         rr:column "Datum opheffing" ;   
      ] ;
      dr:parameterBinding [ 
         dr:parameter "regex" ;
         rr:constant "^(\\d{4})(\\d{2})(\\d{2})$"  ;
      ] ; 
   ] 
   ) ;
   
   dr:triplesMap [
      # ID - CLASS
      rr:subjectMap [ 
         rr:template  "{@sd-organization-nl}{UUID}" ;
         rr:class legal:LegalEntity ;
      ] ;
   
#      # REGISTRATION IDENTIFIER
#      rr:predicateObjectMap [
#         rr:predicate legal:legalIdentifier ;
#         rr:objectMap [
#            rr:parentTriplesMap [
#               rr:subjectMap [
#                  rr:template "{@sd-identifier-nl}kvk/{UUID}" ;
#                  rr:class adms:Identifier ;
#               ] ;
#
#               # DATE ISSUED
#               rr:predicateObjectMap [
#                  rr:predicate dcterms:issued;
#                  rr:objectMap [
#                     rr:template "{REGISTRATION_DATE_SPLIT.match#1}-{REGISTRATION_DATE_SPLIT.match#2}-{REGISTRATION_DATE_SPLIT.match#3}" ;
#                     rr:datatype xsd:date;
#                  ] ;
#               ] ;
#
#               # ISSUING BODY
#               rr:predicateObjectMap [
#                  rr:predicate dcterms:creator;
#                  rr:objectMap [
#                     rr:constant sd-agency-nl:kvk ;
#                  ] ;
#               ] ;
#            ] ;
#         ] ;
#      ] ;   
      
#      # JURISDICTION (ASSUME NETHERLANDS FOR ALL)
#      rr:predicateObjectMap [ 
#         rr:predicate  dbo:jurisdiction ;
#         rr:objectMap  [ 
#            rr:constant <http://publications.europa.eu/resource/authority/country/NLD> ;
#            rr:termType  rr:IRI ;
#         ] ;
#      ] ;  

      # LEGAL FORM (TEMPORARY UNTIL SKOS VOCABULARY DECIDED)
      rr:predicateObjectMap [ 
         rr:predicate  legal:companyType ;
         rr:objectMap  [ 
            rr:template "{@sd-companytype-item-nl}{Rechtsvorm}" ;
            rr:termType  rr:IRI ;
         ] ;
      ] ;
   
      # ACTIVITY   
      rr:predicateObjectMap [
         rr:predicate legal:companyActivity , sd-voc:primaryActivity ;
         rr:objectMap [
            rr:template "{@sd-nace-item-nl}{Hoofdactiviteit}" ;
            rr:termType rr:IRI ;
         ] ;
      ]  ;   
   
      # ACTIVITY   
      rr:predicateObjectMap [
         rr:predicate legal:companyActivity , sd-voc:secondaryActivity ;
         rr:objectMap [
            rr:template "{@sd-nace-item-nl}{Nevenactiviteit 1}" ;
            rr:termType rr:IRI ;
         ] ;
         rr:objectMap [
            rr:template "{@sd-nace-item-nl}{Nevenactiviteit 2}" ;
            rr:termType rr:IRI ;
         ] ;
      ] ;
   
      # FOUNDATION DATE (if explicitly given used it, else use registration date)
      rr:predicateObjectMap [ 
         rr:predicate  m8g:registrationDate ;
         rr:objectMap  [ 
#            dr:cases ( [
#               rr:template "{ESTABLISHMENT_DATE_SPLIT.match#1}-{ESTABLISHMENT_DATE_SPLIT.match#2}-{ESTABLISHMENT_DATE_SPLIT.match#3}" ;
#               rr:datatype xsd:date ;
#               dr:condition [
#                  rr:column "Datum oprichting" ;
#                  drop:neq "0";
#               ] ;
#            ] [
               rr:template "{REGISTRATION_DATE_SPLIT.match#1}-{REGISTRATION_DATE_SPLIT.match#2}-{REGISTRATION_DATE_SPLIT.match#3}" ;
               rr:datatype xsd:date ;
#            ] )
         ] ;      
      ] ;   
   
      # DISSOLUTION DATE 
      rr:predicateObjectMap [ 
         rr:predicate  schema:dissolutionDate ;
         rr:objectMap  [ 
           rr:template "{DEREGISTRATION_DATE_SPLIT.match#1}-{DEREGISTRATION_DATE_SPLIT.match#2}-{DEREGISTRATION_DATE_SPLIT.match#3}" ;
           rr:datatype xsd:date ;
           dr:condition [
              rr:column "Datum opheffing" ;
              drop:neq "0";
           ] ;
         ] ;      
      ]   
   ] ;
   