import variables
from wordpress_xmlrpc import Client
from wordpress_xmlrpc.methods.posts import GetPosts
import collections
collections.Iterable = collections.abc.Iterable
import ssl
import openai
import sib_api_v3_sdk
from sib_api_v3_sdk.rest import ApiException
import datetime
import sys

openai.api_key = variables.openaikey

def getWordpressPosts():
    wp_url = "https://korben.info/wp/xmlrpc.php"
    wp_username = variables.wordpressuser
    wp_password = variables.wordpresspass
    wp = Client(wp_url, wp_username, wp_password)

    filter = {
        'post_status': 'publish',
        'orderby': 'date',
        'order': 'DESC',
        'date_query': {
            'after': '1 week ago'
        }
    }

    all_posts = wp.call(GetPosts(filter))
    return all_posts

def createHtmlList(posts):
    html = ""
    
    for post in posts:
        prompt = "Résume en 2 lignes dans un style cool et détendu, proche du lecteur, le texte suivant afin de donner envie de le lire : " + post.content + "\n"
        html += "<li><h2><a href='" + post.link + "'>" + post.title + "</a></h2><p>" + summarize(prompt) + "</p></li>"
    return html

def newsletterContent(list):
    content = ""

    with open("template.html", "r") as f:
        content = f.read()
    content = content.replace("params.html", list)
    prompttitre = "J'ai besoin d'un titre pour une newsletter. Ce titre doit cibler le sujet le plus intéressant du texte suivant et doit être sous la forme d'une phrase courte et impactante qui donne envie de cliquer pour ouvrir la newsletter. Cette phrase doit faire entre 3 et 8 mots + un emoji maxium. Pas de balise HTML dans ce titre. :\n " + list + "\n"
    promptintro = "Rédige un texte d'introduction en HTML de 3 lignes à la première personne du masculin. Place chaque phrase dans une balise <p>. Le texte doit être positif, enjoué et sympathique pour ma newsletter, \
        qui donne envie de lire la newsletter. Base toi sur le contenu suivant : " + list + " \n"
    titre = summarize(prompttitre)
    titre = titre.replace('"','')
    content = content.replace("params.title", titre)
    content = content.replace("params.intro", summarize(promptintro))
    return titre, content

def summarize(prompt):
    summary = ""
    try:
        summary = openai.Completion.create(
            engine = "text-davinci-003",
            prompt = prompt,
            temperature = 0.5,
            max_tokens = 300,
            top_p = 1,
            frequency_penalty = 1,
            presence_penalty = 1,
        )
        return summary.choices[0].text
    except Exception as e:
        print(e)
        sys.exit()

def sendNewsletter(titre, html):
    configuration = sib_api_v3_sdk.Configuration()
    configuration.api_key['api-key'] = variables.sendinbluekey
    api_instance = sib_api_v3_sdk.EmailCampaignsApi(sib_api_v3_sdk.ApiClient(configuration))

    email_campaigns = sib_api_v3_sdk.CreateEmailCampaign(
        name = titre,
        subject = titre,
        html_content = html,
        sender = sib_api_v3_sdk.SendSmtpEmailSender(name = "Korben", email = "korben@korben.info"),
        recipients = {"listIds": [16]},
        to_field = "{FNAME} {LNAME}",
        scheduled_at = getNextMondayDate(),
    )

    try:
        api_response = api_instance.create_email_campaign(email_campaigns)
        print(api_response)
    except ApiException as e:
        print("Exception when calling EmailCampaignsApi->send_transac_email: %s\n" % e)
    return

def getNextMondayDate():
    today = datetime.date.today()
    monday = today + datetime.timedelta(days = -today.weekday(), weeks = 1)
    monday = monday.strftime("%Y-%m-%d")+"T08:00:00+01:00"
    return monday


if __name__ == "__main__":
    #print(getNextMondayDate())
    posts = getWordpressPosts()
    htmllist = createHtmlList(posts)
    content = newsletterContent(htmllist)
    titre = content[0]
    html = content[1]
    sendNewsletter(titre, html)
    #save content to file html
    #with open("newsletter.html", "w") as f:
    #    f.write(content)

    
