#!/usr/bin/env python3
"""Fetch unread emails from the last N hours over IMAP and print them as JSON."""
import argparse
import email
import imaplib
import json
import os
from datetime import datetime, timedelta, timezone
from email.header import decode_header

parser = argparse.ArgumentParser()
parser.add_argument("--hours", type=int, default=24)
args = parser.parse_args()

IMAP_HOST = os.environ["IMAP_HOST"]
IMAP_USER = os.environ["IMAP_USER"]
IMAP_PASS = os.environ["IMAP_PASS"]

since = (datetime.now(timezone.utc) - timedelta(hours=args.hours)).strftime("%d-%b-%Y")

conn = imaplib.IMAP4_SSL(IMAP_HOST)
conn.login(IMAP_USER, IMAP_PASS)
conn.select("INBOX")

_, data = conn.search(None, f'(SINCE "{since}")')
messages = []

for num in data[0].split():
    _, msg_data = conn.fetch(num, "(RFC822)")
    msg = email.message_from_bytes(msg_data[0][1])

    subject, enc = decode_header(msg.get("Subject", ""))[0]
    if isinstance(subject, bytes):
        subject = subject.decode(enc or "utf-8", errors="ignore")

    body = ""
    if msg.is_multipart():
        for part in msg.walk():
            if part.get_content_type() == "text/plain":
                body = part.get_payload(decode=True).decode(errors="ignore")
                break
    else:
        body = msg.get_payload(decode=True).decode(errors="ignore")

    messages.append(
        {
            "from": msg.get("From", ""),
            "subject": subject,
            "date": msg.get("Date", ""),
            "preview": body[:400],
        }
    )

conn.logout()
print(json.dumps(messages, ensure_ascii=False))
