"""
PPM Infrastructure — ProgramProject Repository Implementation

پیاده‌سازی ریپازیتوری ارتباط برنامه-پروژه با Django ORM.
"""

from typing import Optional, List
from uuid import UUID

from ...domain.entities.program import ProgramProject
from ...domain.repositories.interfaces import IProgramProjectRepository
from ..persistence.models import ProgramProjectModel
from .mappers import ProgramProjectMapper


class DjangoProgramProjectRepository(IProgramProjectRepository):
    """پیاده‌سازی ریپازیتوری ارتباط برنامه-پروژه."""

    def save(self, entity: ProgramProject) -> ProgramProject:
        try:
            model = ProgramProjectModel.objects.get(id=entity.id)
            model = ProgramProjectMapper.to_model(entity, model)
        except ProgramProjectModel.DoesNotExist:
            model = ProgramProjectMapper.to_model(entity)
        model.save()
        return ProgramProjectMapper.to_entity(model)

    def get_by_id(self, id: UUID) -> Optional[ProgramProject]:
        try:
            model = ProgramProjectModel.objects.get(id=id)
            return ProgramProjectMapper.to_entity(model)
        except ProgramProjectModel.DoesNotExist:
            return None

    def find(self, **filters) -> List[ProgramProject]:
        qs = ProgramProjectModel.objects.filter(**filters)
        return [ProgramProjectMapper.to_entity(m) for m in qs]

    def delete(self, id: UUID) -> None:
        ProgramProjectModel.objects.filter(id=id).delete()

    def find_by_program(self, program_id: UUID) -> List[ProgramProject]:
        return self.find(program_id=program_id)

    def find_by_project(self, project_id: UUID) -> List[ProgramProject]:
        return self.find(project_id=project_id)
