"""Helper functions for Mail and Packages.""" from __future__ import annotations import datetime import logging import os from pathlib import Path from shutil import copyfile from typing import Any from aioimaplib import IMAP4_SSL from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant from .const import ( AMAZON_DELIVERED_SUBJECT, AMAZON_EXCEPTION_SUBJECT, AMAZON_HUB_SUBJECT, AMAZON_OTP_SUBJECT, ATTR_COUNT, ATTR_TRACKING, BINARY_SENSORS, CONF_PATH, SENSOR_TYPES, ) from .shippers import SHIPPER_REGISTRY from .shippers.usps import USPSShipper from .utils.image import ( default_image_path, ) _LOGGER = logging.getLogger(__name__) # Legacy constants for tests amazon_exception = AMAZON_EXCEPTION_SUBJECT amazon_hub = AMAZON_HUB_SUBJECT amazon_otp = AMAZON_OTP_SUBJECT amazon_search_legacy = AMAZON_DELIVERED_SUBJECT image_file_name = "mail_today.gif" async def get_count( account: IMAP4_SSL, sensor_type: str, body_count: bool, image_path: str, hass: HomeAssistant, ) -> dict[str, Any]: """Legacy get_count wrapper for tests.""" shipper_class = SHIPPER_REGISTRY.get(sensor_type) if not shipper_class: _LOGGER.error("No shipper found for %s", sensor_type) return {ATTR_COUNT: 0, ATTR_TRACKING: []} shipper = shipper_class(hass, {CONF_PATH: image_path}) today = datetime.datetime.now().strftime("%d-%b-%Y") return await shipper.process(account, today, sensor_type) async def get_mails( account: IMAP4_SSL, address_list: list[str], hass: HomeAssistant, config: dict[str, Any], ) -> int: """Legacy get_mails wrapper for tests.""" shipper = USPSShipper(hass, config) today = datetime.datetime.now().strftime("%d-%b-%Y") result = await shipper.process(account, today, "usps_mail") return result.get(ATTR_COUNT, 0) async def fetch( hass: HomeAssistant, config: dict[str, Any], account: IMAP4_SSL, sensor: str, ) -> int: """Legacy fetch wrapper for tests.""" shipper_class = SHIPPER_REGISTRY.get(sensor) if not shipper_class: return 0 shipper = shipper_class(hass, config) today = datetime.datetime.now().strftime("%d-%b-%Y") data = await shipper.process(account, today, sensor) return data.get(ATTR_COUNT, 0) async def get_items( hass: HomeAssistant, config: dict[str, Any], account: IMAP4_SSL, sensor: str, ) -> dict[str, Any]: """Legacy get_items wrapper for tests.""" shipper_class = SHIPPER_REGISTRY.get(sensor) if not shipper_class: return {ATTR_COUNT: 0, ATTR_TRACKING: []} shipper = shipper_class(hass, config) today = datetime.datetime.now().strftime("%d-%b-%Y") return await shipper.process(account, today, sensor) def get_resources(hass: HomeAssistant | None = None) -> dict: """Return resources from const.""" resources = {k: v.name for k, v in SENSOR_TYPES.items()} resources.update({k: v.name for k, v in BINARY_SENSORS.items() if v.selectable}) return resources def copy_images(hass: HomeAssistant, config: ConfigEntry) -> None: """Copy processed images to www directory.""" image_path = Path(hass.config.path()) / default_image_path(hass, config) www_path = Path(hass.config.path()) / "www" / "mail_and_packages" if not www_path.is_dir(): www_path.mkdir(parents=True, exist_ok=True) for root, _, files in os.walk(image_path): for file in files: if file.endswith((".gif", ".jpg", ".png")): src = Path(root) / file dest = www_path / file try: copyfile(str(src), str(dest)) except OSError as err: _LOGGER.error("Error copying image: %s", err)