import smtplib
import ssl
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

from src.config import settings
from src.data.model.schemas import Shop, UserData
from src.data.model.schemas.agent import Partner
from src.data.model.schemas.contact import Contact
from src.data.model.schemas.order import Order
from src.mailing.mail.invoice_b2b import table as b2b_invoice_table
from src.mailing.mail.invoice_b2b_row import row as b2b_invoice_table_row
from src.mailing.mail.contact_query import query
from src.mailing.mail.invoice_partnertool import invoice_message


def send_mail(to, content, subject, attachment_bytes=None, attachment_file_name=None):
    """
    Sends email
    :param attachment_file_name:
    :param attachment_bytes:
    :param subject:
    :param to:
    :param content:
    :return:
    """

    # create mime multipart message
    message = MIMEMultipart("alternative")
    message["Subject"] = subject
    message["From"] = settings.mailing_user
    message["To"] = to

    message.attach(MIMEText(content, 'html'))
    if attachment_bytes and attachment_file_name:
        attachment = MIMEApplication(attachment_bytes, Name=attachment_file_name)
        attachment['Content-Disposition'] = f'attachment; filename="{attachment_bytes}"'
        message.attach(attachment)

    context = ssl.create_default_context()
    with smtplib.SMTP_SSL(settings.mailing_server, 465, context=context) as server:
        server.login(settings.mailing_user, settings.mailing_user_password)
        server.sendmail(
            settings.mailing_user, to, message.as_string()
        )


def create_invoice(order: Order):
    context = ...
    rows = ""
    for detail in order.items:
        ...
    context["%rows"] = rows


def send_order(email: str, order: Order, partner: Partner, shop: Shop):
    if shop == Shop.B2B:
        row = ""
        for item in order.items:
            row_context = {
                "%article_number": item.article_number,
                "%size": item.size,
                "%color": item.color,
                "%quantity": item.quantity,
                "%price": item.price,
                "%overall_price": item.price * item.quantity
            }
            row += put_context(b2b_invoice_table_row, row_context)

        table_context = {
            "%order_num": order.id,
            "%searchstring": partner.searchstring,
            "%name": partner.name,
            "%street": partner.street,
            "%postalcode": partner.postalcode,
            "%city": partner.city,
            "%land": partner.land,
            "%details_row": row,
        }

        invoice_table = put_context(b2b_invoice_table, table_context)
        print(invoice_table)
        send_mail(email, invoice_table, f"Ihre Bestellung bei Gate One mit der Bestellnummer : {order.id}")
    elif shop == shop.PARTNERTOOL:
        content = invoice_message % (
            order.id, order.id
        )
        send_mail(email, content, f"Auftragsinformation Gate One Nummer : : {order.id}")


def send_changed_password(email: str, user_data: UserData):
    content = """
    Ihre
    Zugangsdaten: \n\tUsername
    %s \n\t Passwort:
    %s
    """ % (user_data.username, user_data.password)
    send_mail(email, content, "Passwortänderung")


def send_contact_query(contact: Contact):
    receivers = [
        "info@gate-one-fashion.de",
        "shop@gate-one-fashion.de",
        contact.email
    ]

    content = query % (
        contact.company,
        contact.name,
        contact.street,
        contact.postalcode,
        contact.city,
        contact.country,
        contact.phone,
        contact.email,
        contact.message
    )

    for receiver in receivers:
        send_mail(receiver, content, "B2B: Kontaktanfrage")


def put_context(template: str, context: dict):
    ou = template
    for key, value in context.items():
        ou = ou.replace(key, str(value))
    return ou
