"""
Strategy Infrastructure — Strategy Map Objective Repository (Django ORM).
"""

from typing import List, Optional
from uuid import UUID

from ...domain.entities.strategy_map_objective import StrategyMapObjective
from ...domain.repositories.interfaces import StrategyMapObjectiveRepository
from ..persistence.models import StrategyMapObjectiveModel
from .mappers import StrategyMapObjectiveMapper


class DjangoStrategyMapObjectiveRepository(StrategyMapObjectiveRepository):

    def find_by_id(self, obj_id: UUID) -> Optional[StrategyMapObjective]:
        try:
            model = StrategyMapObjectiveModel.objects.get(id=obj_id)
            return StrategyMapObjectiveMapper.to_entity(model)
        except StrategyMapObjectiveModel.DoesNotExist:
            return None

    def find_by_map(self, map_id: UUID) -> List[StrategyMapObjective]:
        qs = StrategyMapObjectiveModel.objects.filter(strategy_map_id=map_id)
        return [StrategyMapObjectiveMapper.to_entity(m) for m in qs]

    def find_by_perspective(self, perspective_id: UUID) -> List[StrategyMapObjective]:
        qs = StrategyMapObjectiveModel.objects.filter(perspective_id=perspective_id)
        return [StrategyMapObjectiveMapper.to_entity(m) for m in qs]

    def save(self, entity: StrategyMapObjective) -> StrategyMapObjective:
        try:
            model = StrategyMapObjectiveModel.objects.get(id=entity.id)
            model = StrategyMapObjectiveMapper.to_model(entity, model)
        except StrategyMapObjectiveModel.DoesNotExist:
            model = StrategyMapObjectiveMapper.to_model(entity)
        model.save()
        return StrategyMapObjectiveMapper.to_entity(model)

    def delete(self, obj_id: UUID) -> bool:
        deleted, _ = StrategyMapObjectiveModel.objects.filter(id=obj_id).delete()
        return deleted > 0
