"""
Strategy Infrastructure — KPI Assignment Repository (Django ORM).
"""

from typing import List, Optional
from uuid import UUID

from ...domain.entities.kpi_assignment import KPIAssignment
from ...domain.repositories.interfaces import KPIAssignmentRepository
from ..persistence.models import KPIAssignmentModel
from .mappers import KPIAssignmentMapper


class DjangoKPIAssignmentRepository(KPIAssignmentRepository):

    def find_by_id(self, assignment_id: UUID) -> Optional[KPIAssignment]:
        try:
            model = KPIAssignmentModel.objects.get(id=assignment_id)
            return KPIAssignmentMapper.to_entity(model)
        except KPIAssignmentModel.DoesNotExist:
            return None

    def find_by_kpi(self, kpi_id: UUID) -> List[KPIAssignment]:
        qs = KPIAssignmentModel.objects.filter(kpi_id=kpi_id)
        return [KPIAssignmentMapper.to_entity(m) for m in qs]

    def find_by_entity(self, level: str, entity_id: UUID) -> List[KPIAssignment]:
        qs = KPIAssignmentModel.objects.filter(level=level, entity_id=entity_id)
        return [KPIAssignmentMapper.to_entity(m) for m in qs]

    def find_active_by_kpi(self, kpi_id: UUID) -> List[KPIAssignment]:
        qs = KPIAssignmentModel.objects.filter(kpi_id=kpi_id, status="active")
        return [KPIAssignmentMapper.to_entity(m) for m in qs]

    def save(self, entity: KPIAssignment) -> KPIAssignment:
        try:
            model = KPIAssignmentModel.objects.get(id=entity.id)
            model = KPIAssignmentMapper.to_model(entity, model)
        except KPIAssignmentModel.DoesNotExist:
            model = KPIAssignmentMapper.to_model(entity)
        model.save()
        return KPIAssignmentMapper.to_entity(model)

    def delete(self, assignment_id: UUID) -> bool:
        deleted, _ = KPIAssignmentModel.objects.filter(id=assignment_id).delete()
        return deleted > 0
