#encoding = utf8
import logging

from asr import AsrObserver
from eventbus import EventBus
from utils import AsyncTaskQueue

logger = logging.getLogger(__name__)


class NLPBase(AsrObserver):
    def __init__(self, context, split, callback=None):
        self._ask_queue = AsyncTaskQueue('NLPBaseQueue')
        self._context = context
        self._split_handle = split
        self._callback = callback
        self._is_running = True

        EventBus().register('stop', self.on_stop)
        EventBus().register('clear_cache', self.on_clear_cache)

    def __del__(self):
        EventBus().unregister('stop', self.on_stop)
        EventBus().unregister('clear_cache', self.on_clear_cache)

    def on_stop(self, *args, **kwargs):
        self.stop()

    def on_clear_cache(self, *args, **kwargs):
        logger.info('NLPBase clear_cache')
        self._ask_queue.clear()

    @property
    def callback(self):
        return self._callback

    @callback.setter
    def callback(self, value):
        self._callback = value

    def _on_callback(self, txt: str):
        if self._callback is not None and self._is_running:
            self._callback.on_message(txt)

    def _request(self, question):
        pass

    def _on_close(self):
        pass

    def process(self, message: str):
        pass

    def completed(self, message: str):
        if not self._is_running:
            return
        logger.info(f'complete:{message}')
        self.ask(message)

    def ask(self, question):
        logger.info(f'ask:{question}')
        self._is_running = True
        self._ask_queue.add_task(self._request, question)
        logger.info(f'ask:{question} completed')

    def stop(self):
        logger.info('NLPBase stop')
        self._is_running = False
        self._ask_queue.clear()
        self._ask_queue.add_task(self._on_close)
        logger.info('NLPBase add close')
        self._ask_queue.stop()
        logger.info('NLPBase _ask_queue stop')

    def pause_talk(self):
        logger.info('NLPBase pause_talk')
        self._is_running = False
        self._ask_queue.clear()