import requests
import json
import time
import os


# def send_alert_msg(alert_msg):
#     """
#     send warning messages to phone via Enterprise WeChat Bot API
#     :param alert_msg: messages needed to be sent
#     :return: None
#     """
#
#     # get the datetime, which is using at a failed situation
#     alert_datetime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
#     # # Enterprise Wechat Bot API and the format of body to send
#     hook_url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=ddea3f5f-fbfc-4c21-994a-71e9fc50e4ef'
#     body = {
#         "msgtype": "text",
#         "text": {
#             "content": alert_msg
#         }
#     }
#
#     # get the result of API call
#     res = requests.post(hook_url, data=json.dumps(body, ensure_ascii=False).encode('utf-8'))
#
#     # when failed, log it in /opt/logs/alert.log file
#     if res.status_code != 200:
#         with open('/opt/logs/alert.log', 'a', encoding='utf-8') as alert_log:
#             alert_log.write(alert_datetime + ' >>>> ')
#             alert_log.write('Failed sending message: ')
#             alert_log.write(alert_msg + '\n')


def main():
    """
    process the file /opt/logs/TODO/todo.txt file, get the items which is to be done within 2 months
    :return: None
    """

    # run tt ls in advance, to generate correct todo.txt file
    os.system("bash /opt/scripts/todo/todo.sh ls > /dev/null")
    # initialize alert_msg with empty string
    alert_msg = ''
    # specify range to be alerted
    alert_day = list(range(61))
    # pretty index for output
    alert_index = {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e', 6: 'f'}
    # prepare a dict with specified format and contend, to receive valid items
    alert_tasks = dict().fromkeys(alert_day, None)
    for key in alert_tasks.keys():
        alert_tasks[key] = []

    with open('/opt/logs/TODO/todo.txt', mode='r', encoding='utf-8') as todo_txt:
        # process every line of the file, and get the left time of the task
        for line in todo_txt.readlines():
            items = line.strip().split('|')
            time_left = int(float(items[2].strip().split(':')[1]))
            content = items[1].strip() + ' | ' + items[3].strip()

            # when the left time smaller than 2 months, put the task needed to be done in the dict
            if time_left in alert_day:
                alert_tasks[time_left].append(content)

    # determine every day to see if there are tasks not done
    for time_left, task in alert_tasks.items():
        # if no task of some day, then skip it
        if task == []:
            continue

        # pretty and accurate word's format
        sp_day = 'days' if time_left > 1 else 'day'
        sp_task = 'tasks' if len(task) > 1 else 'task'

        # different output of alert message tips
        if time_left == 0:
            alert_msg += f'Today, you NEED to finish the following {sp_task}:\n'
        else:
            alert_msg += f'{time_left} {sp_day} left to finish the following {sp_task}:\n'

        # for every specified day, output all tasks needing to be done
        count = 1
        for assignment in task:
            alert_msg += f'  {alert_index[count]}. {assignment}\n'
            count += 1
        alert_msg += '\n'

    alert_msg += 'So, hurry up!! Go get things done!!'
    os.environ['subject'] = 'TODO TIPS'
    os.environ['txt'] = alert_msg
    # os.system('/usr/bin/echo subject = $subject')
    # os.system('/usr/bin/echo txt = $txt')
    # exit(9)
    os.system('/usr/bin/python3 /opt/scripts/alert/sendmail.py "$subject" "$txt"')
    # send_alert_msg(alert_msg)


if __name__ == '__main__':
    main()

