import smtplib
import datetime
from email.message import EmailMessage
from email.utils import formatdate
import requests
import time
import os

def wait_until_unlocked():
    # Wait for locks to be released
    # If you don't do this and edit DokuWiki pages, others may overwrite what you do
    locked = True
    while locked:
        locked = os.path.isfile("/srv/dokuwiki/data/data/locks/e0bc4d991c71e981423bfefd6d257985.lock")

        # Avoid busy loop
        if locked:
            time.sleep(5)

def get_topics():
    with open("/srv/dokuwiki/data/data/pages/intern/diskussionsthemen.txt") as fp:
        raw = fp.read().split('\n')

        # Extract Themen 
        firstline = 0
        lastline = 0
        for index, line in enumerate(raw):
            # Start marker
            if "====== 1." in line and not "1.5" in line:
                firstline = index + 1
                continue
            
            # End marker
            if "====== 2." in line or "====== 1.5" in line:
                lastline = index
                break
        
        # Remove empty lines from topics
        topics = []
        for extracted in raw[firstline:lastline]:
            if extracted != '':
                topics.append(extracted)
    return topics

def send_mail(topics, date):
    # mail template 
    mail = f"""
Liebe Zonies,
    
es gibt wieder Themen die im Plenum besprochen werden sollen. Der nächste
Reguläre Termin ist am nächsten Dienstag ({str(date)}) um 20:00.
Im Wiki (https://wiki.warpzone.ms/intern:diskussionsthemen#diskussionsthemen_naechstes_plenum_automatische_einladung)
stehen folgende Themen:

{chr(10).join(topics)}

Die Teilnahme ist natürlich auch remote möglich unter
https://jitsi.dorf-post.de/warpzone-plenum möglich.

Viele Grüße und bis Dienstag,

sendmail_plenum.py
"""

    msg = EmailMessage()
    msg['Subject'] = f'Aktuelle Plenumsthemen für Dienstag ({str(date)} 20:00)'
    msg['From'] = '{{noreply_email_user}}'
    msg['To'] = 'intern@warpzone.ms'
    msg['Date'] = formatdate(localtime=True)
    msg.set_content(mail)
    
    server = smtplib.SMTP('{{smtp_host}}', {{smtp_port}})
    server.starttls()
    server.login("{{noreply_email_user}}", "{{noreply_email_pass}}")
    server.send_message(msg)
    server.quit()
    return True

def update_page(label):
    with open("/srv/dokuwiki/data/data/pages/intern/diskussionsthemen.txt") as fp:
        raw = fp.read().split('\n')
    
    new_content = []
    topic_replaced = False
    for old_line in raw:
        new_content.append(old_line)

        if not topic_replaced and "====== 1." in old_line:
            new_content.append(f"====== 1.5 {label} ======")
            topic_replaced = True
    
    with open("/srv/dokuwiki/data/data/pages/intern/diskussionsthemen.txt", "w") as fp:
        fp.write("\n".join(new_content))

success = False
try:
    wait_until_unlocked()

    topics = get_topics()
    
    if (len(topics) != 0):
        # calculate date of next tuesday
        date = datetime.date.today()
        while date.strftime('%a') != 'Tue':
            date += datetime.timedelta(1)
        
        success = send_mail(topics, date)
    
        label = f"Diskussionsthemen für {date}"
        if success:
            label += f" (bereits eingeladen)"
        else:
            label += f" (Einladung fehlgeschlagen)"
        success = update_page(label)
    else:
        success = True

except:
    success = False
    raise

finally:
    requests.get("{{ healthchecks_url }}" if success else "{{ healthchecks_url }}" + "/fail")