"""
PPM Infrastructure — Program Repository Implementation

پیاده‌سازی ریپازیتوری برنامه با Django ORM.
"""

from typing import Optional, List
from uuid import UUID

from ...domain.entities.program import Program
from ...domain.repositories.interfaces import IProgramRepository
from ..persistence.models import ProgramModel
from .mappers import ProgramMapper


class DjangoProgramRepository(IProgramRepository):
    """پیاده‌سازی ریپازیتوری برنامه."""

    def save(self, entity: Program) -> Program:
        try:
            model = ProgramModel.objects.get(id=entity.id)
            model = ProgramMapper.to_model(entity, model)
        except ProgramModel.DoesNotExist:
            model = ProgramMapper.to_model(entity)
        model.save()
        return ProgramMapper.to_entity(model)

    def get_by_id(self, id: UUID) -> Optional[Program]:
        try:
            model = ProgramModel.objects.get(id=id)
            return ProgramMapper.to_entity(model)
        except ProgramModel.DoesNotExist:
            return None

    def find(self, **filters) -> List[Program]:
        qs = ProgramModel.objects.filter(**filters)
        return [ProgramMapper.to_entity(m) for m in qs]

    def delete(self, id: UUID) -> None:
        ProgramModel.objects.filter(id=id).delete()

    def find_by_portfolio(self, portfolio_id: UUID) -> List[Program]:
        return self.find(portfolio_id=portfolio_id)

    def find_by_status(self, status: str) -> List[Program]:
        return self.find(status=status)

    def find_by_manager(self, manager_id: UUID) -> List[Program]:
        return self.find(manager_id=manager_id)
