"""Strategy Infrastructure — Policy Repository."""

from typing import List, Optional
from uuid import UUID

from ...domain.entities.policy import Policy
from ...domain.repositories.interfaces import PolicyRepository
from ..persistence.models import PolicyModel
from .mappers import PolicyMapper


class DjangoPolicyRepository(PolicyRepository):
    """پیاده‌سازی Django ORM — PolicyRepository."""

    def find_by_id(self, policy_id: UUID) -> Optional[Policy]:
        try:
            model = PolicyModel.objects.get(id=policy_id)
            return PolicyMapper.to_entity(model)
        except PolicyModel.DoesNotExist:
            return None

    def find_all(self, tenant_id: UUID) -> List[Policy]:
        qs = PolicyModel.objects.filter(tenant_id=tenant_id).order_by("-created_at")
        return [PolicyMapper.to_entity(m) for m in qs]

    def find_by_code(self, tenant_id: UUID, code: str) -> Optional[Policy]:
        try:
            model = PolicyModel.objects.get(tenant_id=tenant_id, code=code)
            return PolicyMapper.to_entity(model)
        except PolicyModel.DoesNotExist:
            return None

    def save(self, entity: Policy) -> Policy:
        try:
            model = PolicyModel.objects.get(id=entity.id)
            model = PolicyMapper.to_model(entity, model)
        except PolicyModel.DoesNotExist:
            model = PolicyMapper.to_model(entity)
        model.save()
        return PolicyMapper.to_entity(model)

    def delete(self, policy_id: UUID) -> bool:
        deleted, _ = PolicyModel.objects.filter(id=policy_id).delete()
        return deleted > 0
