"""Strategy Infrastructure — PolicyAcknowledgment Repository."""

from typing import List, Optional
from uuid import UUID

from ...domain.entities.policy_acknowledgment import PolicyAcknowledgment
from ...domain.repositories.interfaces import PolicyAcknowledgmentRepository
from ..persistence.models import PolicyAcknowledgmentModel
from .mappers import PolicyAcknowledgmentMapper


class DjangoPolicyAcknowledgmentRepository(PolicyAcknowledgmentRepository):
    """پیاده‌سازی Django ORM — PolicyAcknowledgmentRepository."""

    def find_by_id(self, ack_id: UUID) -> Optional[PolicyAcknowledgment]:
        try:
            model = PolicyAcknowledgmentModel.objects.get(id=ack_id)
            return PolicyAcknowledgmentMapper.to_entity(model)
        except PolicyAcknowledgmentModel.DoesNotExist:
            return None

    def find_by_policy(self, policy_id: UUID) -> List[PolicyAcknowledgment]:
        qs = PolicyAcknowledgmentModel.objects.filter(
            policy_id=policy_id,
        ).order_by("-acknowledged_at")
        return [PolicyAcknowledgmentMapper.to_entity(m) for m in qs]

    def find_by_user(self, user_id: UUID) -> List[PolicyAcknowledgment]:
        qs = PolicyAcknowledgmentModel.objects.filter(
            user_id=user_id,
        ).order_by("-acknowledged_at")
        return [PolicyAcknowledgmentMapper.to_entity(m) for m in qs]

    def save(self, entity: PolicyAcknowledgment) -> PolicyAcknowledgment:
        try:
            model = PolicyAcknowledgmentModel.objects.get(id=entity.id)
            model = PolicyAcknowledgmentMapper.to_model(entity, model)
        except PolicyAcknowledgmentModel.DoesNotExist:
            model = PolicyAcknowledgmentMapper.to_model(entity)
        model.save()
        return PolicyAcknowledgmentMapper.to_entity(model)

    def delete(self, ack_id: UUID) -> bool:
        deleted, _ = PolicyAcknowledgmentModel.objects.filter(id=ack_id).delete()
        return deleted > 0
