from invoke import task
from pandas_ods_reader import read_ods
import pandas as pd
from weasyprint import HTML

from datetime import datetime as dt
from datetime import timedelta
import os

HOME = os.path.expanduser('~')
DATE_FORMAT = '%Y-%m-%d'
TODAY = dt.now().strftime(DATE_FORMAT)

SCHOOL_DIR = f'{HOME}/School/Assignments'
ARCHIVE = f'{SCHOOL_DIR}/archive'
ODS_FILE = f'{HOME}/School/Assignments/assignments.ods'
BIN = f'{HOME}/envs/invoke/bin'
STUDENTS = os.environ.get('STUDENTS').split('|')

def browse(c, url):
    c.run(f"librewolf {url}", asynchronous=True)


def code(c, path):
    c.run(f"codium {path}")


def folder(c, path):
    # c.run(f'dolphin {path}', asynchronous=True)
    # c.run(f"nemo {path}")
    c.run(f'konsole --workdir {path}',asynchronous=True)


@task
def open_folder(c):
    folder(c, SCHOOL_DIR)


@task
def dump_ods(c):
    df = read_ods(ODS_FILE)
    print(df)


@task
def print_week(c, person, monday):
    print(f'# {person}\'s Assignements for Week of {monday}')

    motd = open(f'{SCHOOL_DIR}/motd.txt', 'r').read()
    print(motd)


    day = dt.strptime(monday, DATE_FORMAT)
    for i in range(0,5):
        print_day(c, person, day.strftime(DATE_FORMAT))
        day = day + timedelta(days=1)

@task
def md_week(c, person, monday):
    c.run(f'cd {SCHOOL_DIR};{BIN}/invoke print-week {person} {monday} > {SCHOOL_DIR}/{person}.{monday}.md')


@task
def md_all(c, monday):
    for person in STUDENTS:
        md_week(c, person, monday)
        c.run(f'codium {SCHOOL_DIR}/{person}.{monday}.md')

@task
def html_all(c, monday):
    for person in STUDENTS:
        missing(c, monday, person)  # Warn on any missing subjects.
        md_week(c, person, monday)
        c.run(f'cd {SCHOOL_DIR};{BIN}/markdown_py {person}.{monday}.md > {SCHOOL_DIR}/{person}.{monday}.html')
        c.run(f'cat {SCHOOL_DIR}/style.htm >> {SCHOOL_DIR}/{person}.{monday}.html')

@task
def preview_all(c, monday):
    html_all(c, monday)
    for person in STUDENTS:
        c.run(f'librewolf {SCHOOL_DIR}/{person}.{monday}.html', asynchronous=True)

@task
def make_all(c, monday):
    html_all(c, monday)
    for person in STUDENTS:
        html = f'{SCHOOL_DIR}/{person}.{monday}.html'
        pdf = f'{SCHOOL_DIR}/{person}.{monday}.pdf'
        HTML(html).write_pdf(pdf)
        c.run(f'librewolf {SCHOOL_DIR}/{person}.{monday}.pdf', asynchronous=True)
        

def get_todays_assignments(df, date, person):
    mine = df[df['person'] == person]
    today = mine[mine['date'] == date]
    return today

@task
def missing_on_day(c, person, day):
    df = read_ods(ODS_FILE)
    today = get_todays_assignments(df, day, person)
    for subject in ['College Prep', 'Life Skills', 'Job Prep', 'Health Science']:
        if not 'All Day Event' in today['subject'].values and not subject in today['subject'].values:
            print(f'Missing {subject} for {person} on {day}')

@task
def missing(c, monday, person=None):

    if not person:
        for person in STUDENTS:
            missing(c, monday, person)
    else:
        day = dt.strptime(monday, DATE_FORMAT)
        for i in range(0,5):
            missing_on_day(c, person, day.strftime(DATE_FORMAT))
            day = day + timedelta(days=1)

@task
def print_day(c, person, date):
    df = read_ods(ODS_FILE)
    # df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d')
    # today = df.loc(df['date'] >= '2026-01-12')
    mine = df[df['person'] == person]
    today = mine[mine['date'] == date]

    weekday = dt.strptime(date, DATE_FORMAT).strftime('%A')

    print()
    print()
    print(f"## {person}'s Assignments for {weekday}, {date}")


    for subject, row in today.groupby('subject'):
        print()
        print()
        subject = row['subject'].values[0]
        minutes = int(row['minutes'].values[0])
        print(f'### {subject} - {minutes} minutes')
        print()
        for task in row['task'].values:
            print()
            print(f'- [ ] {task}')
        if(len(row['tip'].values) > 0):
            for tip in row['tip'].values:
                # Sometimes a float.
                if hasattr(tip, 'strip'):
                    print()
                    print(f'> Tip: {tip.strip()}')

        if(len(row['when_done'].values) > 0):
            for tip in row['when_done'].values:
                # Sometimes a float.
                if hasattr(tip, 'strip'):
                    print()
                    print(f'**When done**: {tip.strip()}')

@task
def files(c):
    c.run('dolphin .')


@task
def cleanup(c):
    c.run(f'mv {SCHOOL_DIR}/*.md {ARCHIVE}')
    c.run(f'mv {SCHOOL_DIR}/*.html {ARCHIVE}')

@task
def fresh_week(c):
    cleanup(c)
    c.run(f'mv {SCHOOL_DIR}/*.pdf {ARCHIVE}')


@task
def checklist(c):
    print('- [ ] `fresh-week` to clean up old files.')
    print('- [ ] start libreoffice and open `assignements.ods`')
    print('- [ ] copy a previous sheet to be the new first sheet, and update the date Monday date.')
    print('- [ ] `invoke missing YYYY.MM.DD` the .ods file.')
    print('- [ ] `invoke make-all YYYY.MM.DD` to generate PDF files')
    print('- [ ] review the PDF files and recreate if needed.')

