#!/usr/bin/env python
"""Cron entry point: polls the shared intake mailbox over IMAP and turns new
emails into Document/IntakeEvent rows (see app/processing/email_intake.py).

Only active when IMAP_ENABLED=true. Configure a cPanel Cron Job, e.g. every
5 minutes:
    */5 * * * * /home/<cpaneluser>/virtualenv/memodoc/3.x/bin/python \
        /home/<cpaneluser>/memodoc/scripts/fetch_email_documents.py >> \
        /home/<cpaneluser>/memodoc/logs/fetch_email.log 2>&1
"""
import email
import imaplib
import os
import sys
from email.policy import default as default_policy

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from app import create_app
from app.extensions import db
from app.processing.email_intake import process_email_message


def main():
    app = create_app()

    if not app.config["IMAP_ENABLED"]:
        print("IMAP_ENABLED no está activo, no se revisa el correo.")
        return

    host = app.config["IMAP_HOST"]
    port = app.config["IMAP_PORT"]
    user = app.config["IMAP_USER"]
    password = app.config["IMAP_PASSWORD"]
    folder = app.config["IMAP_FOLDER"]

    if not all([host, user, password]):
        print("Faltan IMAP_HOST/IMAP_USER/IMAP_PASSWORD; no se puede conectar.")
        return

    with app.app_context():
        imap = imaplib.IMAP4_SSL(host, port)
        try:
            imap.login(user, password)
            imap.select(folder)

            status, data = imap.search(None, "UNSEEN")
            if status != "OK":
                print(f"No se pudo buscar correos nuevos: {status}")
                return

            message_ids = data[0].split()
            if not message_ids:
                print("No hay correos nuevos.")
                return

            for message_id in message_ids:
                status, msg_data = imap.fetch(message_id, "(RFC822)")
                if status != "OK":
                    print(f"No se pudo leer el mensaje {message_id}: {status}")
                    continue

                raw_bytes = msg_data[0][1]
                msg = email.message_from_bytes(raw_bytes, policy=default_policy)

                try:
                    events = process_email_message(msg)
                    db.session.commit()
                    for event in events:
                        print(f"  -> {event.channel}/{event.status} de {event.sender_identifier}")
                except Exception as exc:  # noqa: BLE001 - isolate failures per email
                    db.session.rollback()
                    print(f"Error procesando mensaje {message_id}: {exc}")
                    continue

                imap.store(message_id, "+FLAGS", "\\Seen")

            print(f"Procesados {len(message_ids)} correo(s) nuevo(s).")
        finally:
            try:
                imap.logout()
            except Exception:  # noqa: BLE001 - best-effort cleanup
                pass


if __name__ == "__main__":
    main()
