"""
PPM Infrastructure — Scoring Criterion Repository

پیاده‌سازی ریپازیتوری معیار امتیازدهی.
"""
from typing import Optional, List
from uuid import UUID

from ...domain.entities.scoring import ScoringCriterion
from ...domain.repositories.interfaces import ScoringCriterionRepository
from ..persistence.models import ScoringCriterionModel
from .mappers import ScoringCriterionMapper


class DjangoScoringCriterionRepository(ScoringCriterionRepository):

    def save(self, entity: ScoringCriterion) -> ScoringCriterion:
        try:
            model = ScoringCriterionModel.objects.get(pk=entity.id)
            model = ScoringCriterionMapper.to_model(entity, model)
        except ScoringCriterionModel.DoesNotExist:
            model = ScoringCriterionMapper.to_model(entity)
        model.save()
        return ScoringCriterionMapper.to_entity(model)

    def get_by_id(self, id: UUID) -> Optional[ScoringCriterion]:
        try:
            model = ScoringCriterionModel.objects.get(pk=id)
            return ScoringCriterionMapper.to_entity(model)
        except ScoringCriterionModel.DoesNotExist:
            return None

    def find(self, **filters) -> List[ScoringCriterion]:
        qs = ScoringCriterionModel.objects.filter(**filters)
        return [ScoringCriterionMapper.to_entity(m) for m in qs]

    def delete(self, id: UUID) -> None:
        ScoringCriterionModel.objects.filter(pk=id).delete()

    def find_by_model(self, scoring_model_id: UUID) -> List[ScoringCriterion]:
        qs = ScoringCriterionModel.objects.filter(
            scoring_model_id=scoring_model_id,
        ).order_by("order", "name")
        return [ScoringCriterionMapper.to_entity(m) for m in qs]
