"""
PPM Infrastructure — Project Score Repository

پیاده‌سازی ریپازیتوری امتیاز پروژه.
"""
from typing import Optional, List
from uuid import UUID

from ...domain.entities.scoring import ProjectScore
from ...domain.repositories.interfaces import ProjectScoreRepository
from ..persistence.models import ProjectScoreModel
from .mappers import ProjectScoreMapper


class DjangoProjectScoreRepository(ProjectScoreRepository):

    def save(self, entity: ProjectScore) -> ProjectScore:
        try:
            model = ProjectScoreModel.objects.get(pk=entity.id)
            model = ProjectScoreMapper.to_model(entity, model)
        except ProjectScoreModel.DoesNotExist:
            model = ProjectScoreMapper.to_model(entity)
        model.save()
        return ProjectScoreMapper.to_entity(model)

    def get_by_id(self, id: UUID) -> Optional[ProjectScore]:
        try:
            model = ProjectScoreModel.objects.get(pk=id)
            return ProjectScoreMapper.to_entity(model)
        except ProjectScoreModel.DoesNotExist:
            return None

    def find(self, **filters) -> List[ProjectScore]:
        qs = ProjectScoreModel.objects.filter(**filters)
        return [ProjectScoreMapper.to_entity(m) for m in qs]

    def delete(self, id: UUID) -> None:
        ProjectScoreModel.objects.filter(pk=id).delete()

    def find_by_project(self, project_id: UUID, scoring_model_id: UUID) -> List[ProjectScore]:
        qs = ProjectScoreModel.objects.filter(
            project_id=project_id,
            scoring_model_id=scoring_model_id,
        )
        return [ProjectScoreMapper.to_entity(m) for m in qs]

    def find_by_model(self, scoring_model_id: UUID) -> List[ProjectScore]:
        qs = ProjectScoreModel.objects.filter(
            scoring_model_id=scoring_model_id,
        )
        return [ProjectScoreMapper.to_entity(m) for m in qs]
