# Různé

import datetime
import email.message
import email.headerregistry
import re
from sqlalchemy.orm import joinedload
import subprocess
from typing import Any, Optional
import textwrap

import mo.db as db
import config

current_log_user: Optional[db.User] = None


def log(type: db.LogType, what: int, details: Any):
    entry = db.Log(
        changed_by=current_log_user.user_id if current_log_user else None,
        type=type,
        id=what,
        details=details,
    )
    db.get_session().add(entry)


def send_password_reset_email(user: db.User, link: str):
    if not hasattr(config, 'MAIL_FROM'):
        raise RuntimeError('V configu chybí pole MAIL_FROM.')

    msg = email.message.EmailMessage()
    msg['From'] = email.headerregistry.Address(
        display_name='Odevzdávací Systém MO', addr_spec=config.MAIL_FROM
    )
    msg['To'] = [
        email.headerregistry.Address(
            display_name='{} {}'.format(user.first_name, user.last_name),
            addr_spec=user.email,
        )
    ]
    msg['Subject'] = 'OSMO – obnova hesla'
    msg['Date'] = datetime.datetime.now()

    body = textwrap.dedent('''
        Pro obnovení hesla pro váš účet v Odevzávacím Systému MO klikněte sem: {}

        Váš OSMO
    '''.format(link))

    msg.set_content(body, cte='quoted-printable')

    sm = subprocess.Popen(
        [
            '/usr/sbin/sendmail',
            '-oi',
            '-f',
            config.MAIL_FROM,
            user.email,
        ],
        stdin=subprocess.PIPE,
    )
    sm.communicate(msg.as_bytes())

    if sm.returncode != 0:
        raise RuntimeError('Sendmail failed with return code {}'.format(sm.returncode))