from datetime import datetime as dt
import logging
import os

import simplematrixbotlib as botlib

from goals.db import Data


SERVER = os.environ.get('MATRIX_SERVER')
BOT_NAME = os.environ.get('GOAL_BOT')
BOT_PWD = os.environ.get('GOAL_BOT_PWD')

DATE_FORMAT = '%Y-%m-%d'

def today():
    return dt.now().strftime(DATE_FORMAT)

creds = botlib.Creds(SERVER, BOT_NAME, BOT_PWD)
bot = botlib.Bot(creds)
PREFIX = '!goal'

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

async def do_goal(match):
    '''
    Bot help here?

    '''
    # logger.debug(f'match {str(match)}')
    if match.command('help'):
        return ['help']

    if match.command('setup'):
        result = Data().setup()
        return [result]

    if match.command('add'):
        new = ' '.join(match.args()[1:])
        result = Data().add_goal(new)
        return [f'Goal added with id {result}']

    if match.command('list'):
        goals = Data().list_goals()
        results = ['Goals list...']
        for goal in goals:
            results.append(str(goal))
        return results

    if match.command('add-task'):
        goal_id = int(match.args()[1])
        new = ' '.join(match.args()[2:])
        result = Data().add_task(goal_id=goal_id, name=new)
        return [f'Added task with id {result}']

    if match.command('print'):
        goal_id = int(match.args()[1])
        logger.debug(f'Searching for goal {goal_id}...')
        goal,tasks = Data().get_goal(goal_id)

        results = []
        results.append(f' ## {goal}')
        for task in tasks:
            if(task.complete_date):
                results.append(f' - [x] {task}')
            else:
                results.append(f' - [ ] {task}')
        return results

    if match.command('done'):
        goal_id = int(match.args()[1])
        logger.debug(f'Searching for goal {goal_id}...')
        result = Data().complete_goal(goal_id)
        return [result]
    
    return __doc__


@bot.listener.on_message_event
async def goals(room, message):
    match = botlib.MessageMatch(room, message, bot, PREFIX)

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

    if match.prefix():
        result_lines = await do_goal(match)
        for line in result_lines:
            await bot.api.send_text_message(
                room.room_id, str(line))


bot.run()

