"""Component that will help set the Dlib face detect processing."""

from __future__ import annotations

import io
import logging

import face_recognition
import voluptuous as vol

from homeassistant.components.image_processing import (
    CONF_CONFIDENCE,
    PLATFORM_SCHEMA as IMAGE_PROCESSING_PLATFORM_SCHEMA,
    FaceInformation,
    ImageProcessingFaceEntity,
)
from homeassistant.const import ATTR_NAME, CONF_ENTITY_ID, CONF_NAME, CONF_SOURCE
from homeassistant.core import (
    DOMAIN as HOMEASSISTANT_DOMAIN,
    HomeAssistant,
    split_entity_id,
)
from homeassistant.helpers import config_validation as cv
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.issue_registry import IssueSeverity, create_issue
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType

from . import CONF_FACES, DOMAIN

_LOGGER = logging.getLogger(__name__)


PLATFORM_SCHEMA = IMAGE_PROCESSING_PLATFORM_SCHEMA.extend(
    {
        vol.Required(CONF_FACES): {cv.string: cv.isfile},
        vol.Optional(CONF_CONFIDENCE, default=0.6): vol.Coerce(float),
    }
)


def setup_platform(
    hass: HomeAssistant,
    config: ConfigType,
    add_entities: AddEntitiesCallback,
    discovery_info: DiscoveryInfoType | None = None,
) -> None:
    """Set up the Dlib Face detection platform."""
    create_issue(
        hass,
        HOMEASSISTANT_DOMAIN,
        f"deprecated_system_packages_yaml_integration_{DOMAIN}",
        breaks_in_ha_version="2025.12.0",
        is_fixable=False,
        issue_domain=DOMAIN,
        severity=IssueSeverity.WARNING,
        translation_key="deprecated_system_packages_yaml_integration",
        translation_placeholders={
            "domain": DOMAIN,
            "integration_title": "Dlib Face Identify",
        },
    )

    confidence: float = config[CONF_CONFIDENCE]
    faces: dict[str, str] = config[CONF_FACES]
    source: list[dict[str, str]] = config[CONF_SOURCE]
    add_entities(
        DlibFaceIdentifyEntity(
            camera[CONF_ENTITY_ID],
            faces,
            camera.get(CONF_NAME),
            confidence,
        )
        for camera in source
    )


class DlibFaceIdentifyEntity(ImageProcessingFaceEntity):
    """Dlib Face API entity for identify."""

    def __init__(
        self,
        camera_entity: str,
        faces: dict[str, str],
        name: str | None,
        tolerance: float,
    ) -> None:
        """Initialize Dlib face identify entry."""

        super().__init__()

        self._attr_camera_entity = camera_entity

        if name:
            self._attr_name = name
        else:
            self._attr_name = f"Dlib Face {split_entity_id(camera_entity)[1]}"

        self._faces = {}
        for face_name, face_file in faces.items():
            try:
                image = face_recognition.load_image_file(face_file)
                self._faces[face_name] = face_recognition.face_encodings(image)[0]
            except IndexError as err:
                _LOGGER.error("Failed to parse %s. Error: %s", face_file, err)

        self._tolerance = tolerance

    def process_image(self, image: bytes) -> None:
        """Process image."""

        fak_file = io.BytesIO(image)
        fak_file.name = "snapshot.jpg"
        fak_file.seek(0)

        image = face_recognition.load_image_file(fak_file)
        unknowns = face_recognition.face_encodings(image)

        found: list[FaceInformation] = []
        for unknown_face in unknowns:
            for name, face in self._faces.items():
                result = face_recognition.compare_faces(
                    [face], unknown_face, tolerance=self._tolerance
                )
                if result[0]:
                    found.append({ATTR_NAME: name})

        self.process_faces(found, len(unknowns))
