"""
Strategy Infrastructure — KPI Actual Repository (Django ORM).
"""

from typing import List, Optional
from uuid import UUID

from ...domain.entities.kpi_actual import KPIActual
from ...domain.repositories.interfaces import KPIActualRepository
from ..persistence.models import KPIActualModel
from .mappers import KPIActualMapper


class DjangoKPIActualRepository(KPIActualRepository):

    def find_by_id(self, actual_id: UUID) -> Optional[KPIActual]:
        try:
            model = KPIActualModel.objects.get(id=actual_id)
            return KPIActualMapper.to_entity(model)
        except KPIActualModel.DoesNotExist:
            return None

    def find_by_kpi(self, kpi_id: UUID) -> List[KPIActual]:
        qs = KPIActualModel.objects.filter(kpi_id=kpi_id)
        return [KPIActualMapper.to_entity(m) for m in qs]

    def find_by_kpi_and_period(self, kpi_id: UUID, period_start, period_end) -> List[KPIActual]:
        qs = KPIActualModel.objects.filter(
            kpi_id=kpi_id,
            period_start=period_start,
            period_end=period_end,
        )
        return [KPIActualMapper.to_entity(m) for m in qs]

    def save(self, entity: KPIActual) -> KPIActual:
        try:
            model = KPIActualModel.objects.get(id=entity.id)
            model = KPIActualMapper.to_model(entity, model)
        except KPIActualModel.DoesNotExist:
            model = KPIActualMapper.to_model(entity)
        model.save()
        return KPIActualMapper.to_entity(model)

    def delete(self, actual_id: UUID) -> bool:
        deleted, _ = KPIActualModel.objects.filter(id=actual_id).delete()
        return deleted > 0
