"""
PPM Infrastructure — Repository Implementations

پیاده‌سازی ریپازیتوری‌ها با Django ORM.
"""

from typing import Optional, List
from uuid import UUID

from ...domain.entities.portfolio import Portfolio
from ...domain.repositories.interfaces import IPortfolioRepository
from ..persistence.models import PortfolioModel
from .mappers import PortfolioMapper


class DjangoPortfolioRepository(IPortfolioRepository):
    """پیاده‌سازی ریپازیتوری پرتفولیو."""

    def save(self, entity: Portfolio) -> Portfolio:
        try:
            model = PortfolioModel.objects.get(id=entity.id)
            model = PortfolioMapper.to_model(entity, model)
        except PortfolioModel.DoesNotExist:
            model = PortfolioMapper.to_model(entity)
        model.save()
        return PortfolioMapper.to_entity(model)

    def get_by_id(self, id: UUID) -> Optional[Portfolio]:
        try:
            model = PortfolioModel.objects.get(id=id)
            return PortfolioMapper.to_entity(model)
        except PortfolioModel.DoesNotExist:
            return None

    def find(self, **filters) -> List[Portfolio]:
        qs = PortfolioModel.objects.filter(**filters)
        return [PortfolioMapper.to_entity(m) for m in qs]

    def delete(self, id: UUID) -> None:
        PortfolioModel.objects.filter(id=id).delete()

    def find_by_status(self, status: str) -> List[Portfolio]:
        return self.find(status=status)

    def find_by_owner(self, owner_id: UUID) -> List[Portfolio]:
        return self.find(owner_id=owner_id)

    def find_children(self, parent_id: UUID) -> List[Portfolio]:
        return self.find(parent_id=parent_id)
