import sys
if sys.version_info < (3,0):
    import urllib as decoder
else:
    import urllib.parse as decoder

from rasa_nlu.training_data import load_data
from rasa_nlu.config import RasaNLUModelConfig
from rasa_nlu.model import Trainer, Metadata, Interpreter
from rasa_nlu import config

import intent

class Classification(object):
    def __init__(self, training_data_file = "training_data.json",
                 config_file = "training_config.json"):
        training_data = load_data(training_data_file)        
        trainer = Trainer(config.load(config_file))
        self.interpreter = trainer.train(training_data)
        self.confidence_threshold = 0.7

        # Create supported intents
        context = { 'confidence_threshold': self.confidence_threshold }
        self.intents = {
                "greet"     : intent.HelloIntent(self, context),
                "get_time"  : intent.GetTimeIntent(self, context),
                "ask_joke"  : intent.JokeIntent(self, context),
                "unknown"   : intent.UnKnownIntent(self, context)
            }
        
    
    def handle(self, message):
        """
        Handles incoming message using trained NLU model and prints response to
        the system out
        Arguments:
            message the message from user to be handled with known intents 
            (greet, add_item, clear_list, show_items, _num_items)
        """
        intent = ""
        confidence = ""
        message = decoder.unquote(message)
        nlu_data = self.interpreter.parse(message)
        if 'intent' in nlu_data:
            if 'name' in nlu_data['intent']:
                intent = nlu_data['intent']['name']
                confidence = nlu_data['intent']['confidence']
        if confidence < self.confidence_threshold:
            return "I'm sorry! Could you please paraphrase?"
        if intent in self.intents:
            return self.intents[intent].execute(nlu_data)