from __future__ import annotations

"""IMAP Email Sync Connector for receiving and parsing invoices automatically."""


import email
import imaplib
import logging
from typing import Any
from uuid import UUID

logger = logging.getLogger(__name__)


class InvoiceEmailSyncMixin:
    """Mixin for IMAP mailbox invoice synchronization."""

    def _execute_real_email_imap_sync(
        self, config_id: UUID, username: str, password: str, extra: dict[str, Any]
    ) -> dict[str, Any]:
        """Kết nối thực tế hòm thư IMAP để quét và tải file XML hóa đơn."""
        server = extra.get("imap_server", "imap.gmail.com")
        port = int(extra.get("imap_port", 993))
        use_ssl = extra.get("use_ssl", True)

        try:
            if use_ssl:
                mail = imaplib.IMAP4_SSL(server, port)
            else:
                mail = imaplib.IMAP4(server, port)

            mail.login(username, password)
            mail.select("INBOX")

            # Search for unread emails with invoices
            status, messages = mail.search(None, "(UNSEEN)")
            msg_ids = messages[0].split()

            new_count = 0
            dup_count = 0

            for m_id in msg_ids[-20:]:  # Process up to last 20 emails
                res, data = mail.fetch(m_id, "(RFC822)")
                for response_part in data:
                    if isinstance(response_part, tuple):
                        msg = email.message_from_bytes(response_part[1])
                        for part in msg.walk():
                            if part.get_content_maintype() == "multipart":
                                continue
                            filename = part.get_filename() or ""
                            if filename.lower().endswith(".xml"):
                                xml_bytes = part.get_payload(decode=True)
                                if xml_bytes:
                                    parsed = self.parse_xml_content(
                                        xml_bytes, source_channel="email_import"
                                    )
                                    save_res = self.save_invoice(
                                        parsed,
                                        user_id=f"Email IMAP ({username})",
                                        auto_reconcile=True,
                                    )
                                    if save_res.get("status") == "success":
                                        new_count += 1
                                    elif save_res.get("status") == "duplicate":
                                        dup_count += 1

            mail.close()
            mail.logout()

            success_msg = f"Đã quét hòm thư {username}: Nạp {new_count} hóa đơn mới, {dup_count} hóa đơn đã tồn tại."
            self._update_sync_status(config_id, "SUCCESS", success_msg)
            return {
                "service": "email_imap",
                "status": "success",
                "message": success_msg,
                "new_imported": new_count,
                "duplicates": dup_count,
            }
        except Exception as exc:
            err_msg = f"Lỗi kết nối hòm thư IMAP ({server}:{port}): {exc!s}"
            self._update_sync_status(config_id, "AUTH_ERROR", err_msg)
            return {"service": "email_imap", "status": "auth_error", "message": err_msg}
