'''
Prefix: !chore

Synax:
!chore COMMAND ARGS

Commands:
help - show this help
add - add a chore 
check - check status of a chore
done - mark a chore as done
list - print the chore list
filter TERM - list all chores that include TERM
undo - mark a chore as undone
'''

from datetime import datetime as dt
import logging
import os

import simplematrixbotlib as botlib

from .db import Data as ChoreData

logger = logging.getLogger(__name__)
logging.basicConfig(filename='matrix-chore-bot.log', encoding='utf-8', level=logging.DEBUG)
logging.getLogger('nio').setLevel(logging.WARNING)

class ChoreBot():
    def __init__(self, matrix_server,
                 bot_name,
                 bot_pwd,
                 db_file=None,
                 bot_prefix='!chore'):

        creds = botlib.Creds(matrix_server, bot_name, bot_pwd)
        self.bot = botlib.Bot(creds)
        self.prefix = bot_prefix
        self.data = ChoreData(db_file=db_file)

    def run(self):
        self.bot.run()

    async def handle_message(self, room, message):
        match = botlib.MessageMatch(room, message, self.bot, self.prefix)

        if not match.is_not_from_this_bot() and match.prefix():
            return

        if match.prefix():
            try:
                result_lines = await self._handle_match(match)
                for line in result_lines:
                    await self.bot.api.send_text_message(
                        room.room_id, str(line))
            except Exception as ex:
                line = f'Ye flask must be load bearing, or something... {str(ex)}'
                await self.bot.api.send_text_message(
                    room.room_id, str(line))


    async def _handle_match(self, match):

        if match.command('list'):
            results = ['## Listing all...']
            for item in self.data.list():
                results.append(item)
            results.append('-- End of List --')
            return results

        if match.command('filter'):
            term = ' '.join(match.args()[1:])
            results = [f'## List matching {term}']
            for item in self.data.filter(term):
                results.append(item)
            results.append('-- End of List --')
            return results
        
        if match.command('setup'):
            results = []
            results.append('Doing chore setup...')
            result = self.data.setup()
            results.append(str(result))
            return results

        if match.command('add'):
            new_chore = ' '.join(match.args()[1:])
            result = self.data.add(new_chore)
            return [result]

        if match.command('check'):
            chore_id = match.args()[1]
            result = self.data.check(chore_id)
            return [result]

        if match.command('done'):
            ids = match.args()[1:]
            results = []
            for chore_id in ids:
                result = self.data.done(chore_id)
                results.append(result)
            return results

        if match.command('undo'):
            chore_id = match.args()[1]
            result = self.data.undo(chore_id)
            return [result]

        if match.command('remove'):
            chore_id = match.args()[1]
            result = self.data.remove(chore_id)
            return [result]

        return [__doc__]

