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