"""
Strategy Infrastructure — Strategic Theme Repository Implementation.
"""

from typing import List, Optional
from uuid import UUID

from ...domain.entities.strategic_theme import StrategicTheme
from ...domain.repositories.interfaces import StrategicThemeRepository
from ..persistence.models import StrategicThemeModel
from .mappers import StrategicThemeMapper


class DjangoStrategicThemeRepository(StrategicThemeRepository):
    """پیاده‌سازی Django ریپازیتوری تم راهبردی."""

    def find_by_id(self, theme_id: UUID) -> Optional[StrategicTheme]:
        try:
            model = StrategicThemeModel.objects.get(id=theme_id)
            return StrategicThemeMapper.to_entity(model)
        except StrategicThemeModel.DoesNotExist:
            return None

    def find_by_tenant(self, tenant_id: UUID) -> List[StrategicTheme]:
        qs = StrategicThemeModel.objects.filter(tenant_id=tenant_id)
        return [StrategicThemeMapper.to_entity(m) for m in qs]

    def find_by_vision(self, vision_id: UUID) -> List[StrategicTheme]:
        qs = StrategicThemeModel.objects.filter(vision_id=vision_id)
        return [StrategicThemeMapper.to_entity(m) for m in qs]

    def find_active_by_tenant(self, tenant_id: UUID) -> List[StrategicTheme]:
        qs = StrategicThemeModel.objects.filter(
            tenant_id=tenant_id,
            status=StrategicThemeModel.Status.ACTIVE,
        )
        return [StrategicThemeMapper.to_entity(m) for m in qs]

    def save(self, entity: StrategicTheme) -> StrategicTheme:
        try:
            model = StrategicThemeModel.objects.get(id=entity.id)
            model = StrategicThemeMapper.to_model(entity, model)
        except StrategicThemeModel.DoesNotExist:
            model = StrategicThemeMapper.to_model(entity)
        model.save()
        return StrategicThemeMapper.to_entity(model)

    def delete(self, theme_id: UUID) -> bool:
        deleted, _ = StrategicThemeModel.objects.filter(id=theme_id).delete()
        return deleted > 0
