import json
import os
import tempfile
from pathlib import Path

import emails
import tweepy
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger


def send_mail_with_tweets():
    # you need to define the following environment variables :
    # SMTP_HOST: smtp server where the email will be sent
    # SMTP_PORT: port used by the smtp server
    # SMTP_TLS: "true" if we want to use TLS "false" otherwise
    # SMTP_USER: optional, user login
    # SMTP_PASSWORD: optional, user password
    smtp = {
        'host': os.getenv('SMTP_HOST'),
        'port': os.getenv('SMTP_PORT'),
    }
    if os.getenv('SMTP_TLS', '').lower() == 'true':
        smtp.update({
            'ssl': True,
            'user': os.getenv('SMTP_USER'),
            'password': os.getenv('SMTP_PASSWORD')
        })
    client = tweepy.Client(os.getenv('BEARER_TOKEN'))

    with tempfile.TemporaryDirectory() as tmp_dir:
        # you may want to replace the extension ".jl" with another one like
        # "txt" because some mail providers can delete files with non-standard extension
        path = Path(tmp_dir) / 'tweets.jl'
        with path.open('w') as f:
            for tweet in tweepy.Paginator(
                    client.search_recent_tweets,
                    '("black panther" OR #wakandaforever) '
                    '(magnificent OR amazing OR excellent OR awesome OR great) -is:retweet',
                    max_results=100
            ).flatten():
                data = {
                    'id': tweet.id,
                    'text': tweet.text,
                    'twitter_url': f'https://twitter/gandi_net/status/{tweet.id}'
                }
                f.write(f'{json.dumps(data)}\n')

        message = emails.Message(
            subject='Wakanda Forever tribute',
            text='You will find attached a file with all the tweets paying tribute to Black Panther',
            mail_from=('Twitter Bot', 'twitter@bot.com')
        )
        message.attach(filename=path.name, content_disposition='inline', data=open(path, 'rb'))
        # replace the destination here with your email address
        response = message.send(to='foo@bar.com', smtp=smtp)

        # log information if the email was not sent
        if response.status_code != 250:
            print('There was an error when trying to send email')


# For a more realistic exemple, you should configure a jobstore to save job info
# in a database, so that if the server crashes and has to restart, the sheduler
# will pick up where it left off
scheduler = BlockingScheduler(timezone='utc')

# we will use the crontab notation to schedule our emailing
# it will be done every morning at 9 a.m
scheduler.add_job(send_mail_with_tweets, CronTrigger.from_crontab('0 9 * * 1'))

# the scheduler starts here and the start call is blocking
scheduler.start()