import os
from datetime import datetime as dt

import simplematrixbotlib as botlib

from school import (get_assignments, STUDENTS)

from chore.db import Data as ChoreData

CHORES = ChoreData()

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'

@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.command("echo"):
        await bot.api.send_text_message(
            room.room_id, " ".join(arg for arg in match.args())
            )

    help_text = '''
        # Print this help text
        !school help
        # List available students
        !school list
        # Get today's assignments
        !school get [NAME]
        # Get an assignment for a date
        !school get [Name] 2026-03-09
    '''
    if match.command("help"):
        await bot.api.send_text_message(
            room.room_id, help_text)

    if match.command("list"):
        student_list = f"Known students are {STUDENTS}."
        await bot.api.send_text_message(
            room.room_id, student_list)

    person = ''
    if match.command("get"):
        print(match.args())
        if(len(match.args()) < 2):
            result = ['Please specify person to get assignments for.']
        else:
            person = match.args()[1]

        if(len(match.args()) > 2):
            day = match.args()[2]
        else:
            day = today() 

        if(person and day):
            await bot.api.send_text_message(room.room_id, f'Fetching assignments for {person} on {day}')
            results = get_assignments(person, day)
        else:
            results = ['Oops.']

        if len(results) < 3:
            results = [f'No assignments found for {person} on {day}.']

        for line in results:

            await bot.api.send_text_message(
                room.room_id, line)


@bot.listener.on_message_event
async def chores(room, message):
    match = botlib.MessageMatch(room, message, bot, '!chore')

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

    if match.command('list'):

        await bot.api.send_text_message(
                room.room_id, 'Listing chores...')

        result = CHORES.list()
        for item in result:
            await bot.api.send_text_message(
                room.room_id, item)

        await bot.api.send_text_message(
                room.room_id, '-- End of List --')
    
    if match.command('setup'):
        await bot.api.send_text_message(
                room.room_id, f'Doing chore setup...')
        result = CHORES.setup()
        result = await bot.api.send_text_message(
                room.room_id, f'Result: {result}')


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

        await bot.api.send_text_message(
                room.room_id, f'Adding chore...{new_chore}...')

        result = CHORES.add(new_chore)
        await bot.api.send_text_message(
            room.room_id, result)



    if match.command('check'):
        chore_id = match.args()[1]

        result = CHORES.check(chore_id)
        await bot.api.send_text_message(
            room.room_id, result)

    if match.command('done'):
        chore_id = match.args()[1]
        result = CHORES.done(chore_id)
        await bot.api.send_text_message(
            room.room_id, result)

    if match.command('undo'):
        chore_id = match.args()[1]
        result = CHORES.undo(chore_id)
        await bot.api.send_text_message(
            room.room_id, result)


    if match.command('remove'):
        chore_id = match.args()[1]
        result = CHORES.remove(chore_id)
        await bot.api.send_text_message(
            room.room_id, result)


bot.run()

