import os
import imaplib
import email
import pytz
from flask import Flask, request, render_template, redirect, url_for
from datetime import datetime, timedelta
app = Flask(__name__)

IMAP_SERVER = '185.119.89.74'
IMAP_PORT = 993
IMAP_USERNAME = 'shadowserver@unlimitedsupport.rs'
IMAP_PASSWORD = 'NQm{y98CvWmh'
BASE_FOLDER = 'email_folders'
now = datetime.utcnow()

@app.route('/check', methods=['GET'])
def check_emails():
    try:
        mail = imaplib.IMAP4_SSL(IMAP_SERVER, IMAP_PORT)
        mail.login(IMAP_USERNAME, IMAP_PASSWORD)

        # Za sad samo INBOX folder
        mail.select('INBOX')

        # unread i da ima "Backup job" u subject
        #search_criteria = '(UNSEEN SUBJECT "Backup job")'
        # Exclude emails with specific subjects: "JetBackup Config," "started," or "webcaffe.ws-sql3h"
        search_criteria = '(UNSEEN SUBJECT "Shadowserver")'
        #search_criteria = '(UNSEEN NOT SUBJECT "JetBackup Config" SUBJECT "Backup job")'

        result, email_ids = mail.search(None, search_criteria)

        if result == 'OK':
            email_ids = email_ids[0].split()
            for email_id in email_ids:
                result, email_data = mail.fetch(email_id, '(RFC822)')
                if result == 'OK':
                    raw_email = email_data[0][1]
                    msg = email.message_from_bytes(raw_email)
                    sender = msg['From']

                    sender_folder = os.path.join(BASE_FOLDER, sender)
                    os.makedirs(sender_folder, exist_ok=True)

                    email_filename = os.path.join(sender_folder, f'email_{email_id.decode("utf-8")}.eml')
                    with open(email_filename, 'wb') as email_file:
                        email_file.write(raw_email)

        mail.logout()
        return redirect(url_for('folder_info'))
    except Exception as e:
        return f'Error: {str(e)}'



@app.route('/')
def folder_info():
    folder_info_list = get_folder_info(BASE_FOLDER)
    
    for folder_info in folder_info_list:
        folder_info['latest_time'] = datetime.strptime(folder_info['latest_time'], "%a, %d %b %Y %H:%M:%S %z").replace(tzinfo=None)
    
    return render_template('folder_info.html', folder_info_list=folder_info_list, now=now)

import os
import re
import email
from email.utils import parsedate_to_datetime



def extract_date_from_email_date_header(email_date_header):
    # This function extracts the date in the format "Thu, 5 Oct 2023 07:12:28 +0000" from the email's "Date" header.
    # If it's already in this format, it returns it unchanged.
    date_format = "%a, %d %b %Y %H:%M:%S %z"

    try:
        parsed_date = parsedate_to_datetime(email_date_header)
        if parsed_date:
            # Convert to Belgrade (CET) time zone
            belgrade_timezone = pytz.timezone('Europe/Belgrade')
            parsed_date = parsed_date.astimezone(belgrade_timezone)
            return parsed_date.strftime(date_format)
    except Exception:
        pass

    return None
    
import os
import email
import re

def get_folder_info(base_folder):
    folder_info_list = []

    for folder_name in os.listdir(base_folder):
        folder_path = os.path.join(base_folder, folder_name)

        if os.path.isdir(folder_path):
            # Extract the part between "@" and ">"
            folder_name_match = re.search(r'@([^>]+)>', folder_name)
            if folder_name_match:
                folder_name = folder_name_match.group(1)

            latest_time = None
            latest_status = None
            latest_subject = None
            latest_message = None

            for root, _, files in os.walk(folder_path):
                for filename in files:
                    if filename.endswith(".eml"):
                        email_file_path = os.path.join(root, filename)

                        with open(email_file_path, 'rb') as email_file:
                            raw_email = email_file.read()
                            msg = email.message_from_bytes(raw_email)
                            email_date = msg['Date']
                            email_subject = msg['Subject']

                            if email_date:
                                email_date = email.utils.parsedate_to_datetime(email_date)
                                if latest_time is None or email_date > latest_time:
                                    latest_time = email_date
                                    latest_subject = email_subject
                                    latest_message = msg.get_payload()
                                    
                                    # Extract the "daily - wa" part from the email subject
                                    backup_job_match = re.search(r'The backup job "(.*?)"', email_subject)
                                    if backup_job_match:
                                        backup_job_name = backup_job_match.group(1)
                                    else:
                                        backup_job_name = "N/A"  # Default value if not found
                                    
                                    if "successfully" in email_subject.lower():
                                        latest_status = 'Completed Successfully'
                                    elif "partially" in email_subject.lower():
                                        latest_status = 'Partially Completed'
                                    elif "failed" in email_subject.lower():
                                        latest_status = 'Failed'

            folder_info_list.append({
                'folder_name': folder_name,  # Updated folder name
                'latest_time': latest_time.strftime('%a, %d %b %Y %H:%M:%S %z') if latest_time else None,
                'latest_status': latest_status,
                'latest_subject': latest_subject,
                'newest_content': latest_message,
                'backup_job_name': backup_job_name  # New field for backup job name
            })

    return folder_info_list







if __name__ == '__main__':
    app.run()
