"""
Strategy Infrastructure — KPI Definition Repository (Django ORM).
"""

from typing import List, Optional
from uuid import UUID

from ...domain.entities.kpi_definition import KPIDefinition
from ...domain.repositories.interfaces import KPIDefinitionRepository
from ..persistence.models import KPIDefinitionModel
from .mappers import KPIDefinitionMapper


class DjangoKPIDefinitionRepository(KPIDefinitionRepository):

    def find_by_id(self, kpi_id: UUID) -> Optional[KPIDefinition]:
        try:
            model = KPIDefinitionModel.objects.get(id=kpi_id)
            return KPIDefinitionMapper.to_entity(model)
        except KPIDefinitionModel.DoesNotExist:
            return None

    def find_by_tenant(self, tenant_id: UUID) -> List[KPIDefinition]:
        qs = KPIDefinitionModel.objects.filter(tenant_id=tenant_id)
        return [KPIDefinitionMapper.to_entity(m) for m in qs]

    def find_by_code(self, code: str, tenant_id: UUID) -> Optional[KPIDefinition]:
        try:
            model = KPIDefinitionModel.objects.get(code=code, tenant_id=tenant_id)
            return KPIDefinitionMapper.to_entity(model)
        except KPIDefinitionModel.DoesNotExist:
            return None

    def find_active_by_tenant(self, tenant_id: UUID) -> List[KPIDefinition]:
        qs = KPIDefinitionModel.objects.filter(tenant_id=tenant_id, status="active")
        return [KPIDefinitionMapper.to_entity(m) for m in qs]

    def save(self, entity: KPIDefinition) -> KPIDefinition:
        try:
            model = KPIDefinitionModel.objects.get(id=entity.id)
            model = KPIDefinitionMapper.to_model(entity, model)
        except KPIDefinitionModel.DoesNotExist:
            model = KPIDefinitionMapper.to_model(entity)
        model.save()
        return KPIDefinitionMapper.to_entity(model)

    def delete(self, kpi_id: UUID) -> bool:
        deleted, _ = KPIDefinitionModel.objects.filter(id=kpi_id).delete()
        return deleted > 0
