import os
import KCALLMConst
import json
import KCALLMActivityUtilities
import KCALLMNutritionUtilities
import KCADBProcessorUtilities as KCAProc


#-----------------------------------------------------------------------------------
#                              Food Archetype
#-----------------------------------------------------------------------------------
def getFoodArchetype():

    arch = '''
@prefix food: <http://www.3dminded.com/RDF/ontology/food#> .

@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . 
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix prov: <http://www.w3.org/ns/prov#> .

food: a owl:Ontology ;
    rdfs:comment "Definition of the food archetype"@en .

food:name a owl:DatatypeProperty;
    rdfs:label "name"@en;
    rdfs:comment """Food or beverage identifier, the name should not contain information related to quantity or container (like glass...).
Ignore food or beverage when it is not consumed in the past, now or in the future.
The cooking mode is not in the name. The name is only in french."""@en;
    rdfs:range xsd:string.

food:quantity a owl:DatatypeProperty ;
    rdfs:label "quantity"@en;
    rdfs:comment "The quantity of food or drink that is or was consumed. Quantity is only in french. Here are examples: 'un quignon', 'un cornet', 'un verre', 'une tranche', 'une boule', 'un', 'deux', 'trois',... Keep the same language."@en;
    rdfs:range xsd:string.

food:cookingMethod a owl:DatatypeProperty ;
    rdfs:label "cooking method"@en;
    rdfs:comment "The cooking method of food. The cooking method is in french."@en;
    rdfs:range xsd:string.

food:type a owl:DatatypeProperty ;
    rdfs:label "type of food"@en;
    rdfs:comment "Identify the type of food."@en;
    rdfs:range xsd:string.

food:food a food:type ;
    rdfs:label "food" .
food:beverage a food:type ;
    rdfs:label "beverage" .
	
food:timeOfTheDay a owl:DatatypeProperty ;
    rdfs:label "time of the day"@en;
    rdfs:comment "Time of the day when food or drink was consumed."@en;
    rdfs:range xsd:string.

food:breakfast a food:timeOfTheDay ;
    rdfs:label "breakfast" .
food:lunch a food:timeOfTheDay ;
    rdfs:label "lunch" .
food:snacking a food:timeOfTheDay ;
    rdfs:label "snacking" .
food:dinner a food:timeOfTheDay ;
    rdfs:label "dinner" .

food:brand a owl:DatatypeProperty ;
    rdfs:label "Brand"@en;
    rdfs:comment """Food or beverage brand. The restaurants are not brand.
When the name is very known (ex: Activia, Coca) and the brand is not mentioned, guess the brand."""@en;
    rdfs:range xsd:string.

food:company a owl:DatatypeProperty ;
    rdfs:label "Company"@en;
    rdfs:comment "Product company."@en;
    rdfs:range xsd:string.

food:enumEvent a rdfs:Class .

food:event a owl:DatatypeProperty ;
    rdfs:label "event"@en;
    rdfs:comment "Event of eating or drinking. Each must have an event"@en;
    rdfs:range food:enumEvent.

food:intent a food:enumEvent ;
    rdfs:label "intent" .
    rdfs:comment "When the event should happen"@en.
food:declaration a food:enumEvent ;
    rdfs:label "declaration" .
    rdfs:comment "When the event has already occured"@en.
food:unknownEvent a food:enumEvent ;
    rdfs:label "unknown" ;
    rdfs:comment "When the event is unknown in the day"@en.

food:event a owl:DatatypeProperty ;
    rdfs:label "event"@en;
    rdfs:comment "Event of eating or drinking. Each must have an event"@en;
    rdfs:range food:enumEvent.

food:intent a food:enumEvent ;
    rdfs:label "intent" .
    rdfs:comment "When the event should happen"@en.
food:declaration a food:enumEvent ;
    rdfs:label "declaration" .
    rdfs:comment "When the event has already occured"@en.
food:unknownEvent a food:enumEvent ;
    rdfs:label "unknown" ;
    rdfs:comment "When the event is unknown in the day"@en.

    '''

    return arch


#-----------------------------------------------------------------------------------
#                              Activity Archetype
#-----------------------------------------------------------------------------------
def getActivityArchetype():

    arch = """
@prefix activity: <http://www.3dminded.com/RDF/ontology/activity#> .

@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix prov: <http://www.w3.org/ns/prov#> .

activity: a owl:Ontology ;
    rdfs:comment "Definition of the sport and physical activity archetype"@en .

activity:name a owl:DatatypeProperty;
    rdfs:label "name"@en;
    rdfs:comment "Sport or physical activity identifier, the name should not contain information related to duration.It is mandatory. Ignore the negative action. Keep the same language"@en;
    rdfs:range xsd:string.

activity:duration a owl:DatatypeProperty ;
    rdfs:label "duration"@en;
    rdfs:comment "t is the time spent to practise the activity or the sport. This duration must be in minute. If the duration is unknown, set duration to 0. A full day of activity is equivalent to a duration of 8 hours. A half day of activity is equivalent to a duration of 4 hours."@en;
    rdfs:range xsd:integer.


# Define the enumeration class
activity:EnumActivity a rdfs:Class .

$SPORT_MAPPING$

activity:event a owl:DatatypeProperty ;
    rdfs:label "event"@en;
    rdfs:comment "Event of eating or drinking. Each must have an event"@en;
    rdfs:range xsd:string.

activity:intent a activity:event ;
    rdfs:label "intent"@en ;
    rdfs:comment "When the event should happen"@en.
activity:declaration a activity:event ;
    rdfs:label "declaration"@en ;
    rdfs:comment "When the event has already occured"@en.
activity:unknownEvent a activity:event ;
    rdfs:label "unknown"@en ;
    rdfs:comment "When the event is unknown in the day, it is the default value"@en.

activity:enumIntensity a rdfs:Class .

activity:intensity a owl:DatatypeProperty ;
    rdfs:label "intensity"@en;
    rdfs:comment "Sport or activity intensity"@en;
    rdfs:range activity:enumIntensity .

activity:lowLevel a activity:enumIntensity ;
    rdfs:label "low"@en ;
    rdfs:comment "When the activity intensity is low"@en.
activity:moderateLevel a activity:enumIntensity ;
    rdfs:label "moderate"@en ;
    rdfs:comment "When the activity intensity is moderate"@en.
activity:highLevel a activity:enumIntensity ;
    rdfs:label "high"@en ;
    rdfs:comment "When the activity intensity is high"@en.
activity:intenseLevel a activity:enumIntensity ;
    rdfs:label "intense"@en ;
    rdfs:comment "When the activity intensity is intense"@en.
activity:veryIntenseLevel a activity:enumIntensity ;
    rdfs:label "very intense"@en ;
    rdfs:comment "When the activity intensity is very intense or like a daredevil or like a madman or I sweat a lot"@en.
activity:unknownLevel a activity:enumIntensity ;
    rdfs:label "unknown"@en ;
    rdfs:comment "When the activity intensity is unknown, it is the default value"@en.

"""
    return arch