<?php

namespace App\Discount\Repository;

use App\Discount\Entity\DiscountRule;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;

class DiscountRuleRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry) { parent::__construct($registry, DiscountRule::class); }

    public function save(DiscountRule $e, bool $flush = true): void
    {
        $this->getEntityManager()->persist($e);
        if ($flush) {
            $this->getEntityManager()->flush();
        }
    }

    public function remove(DiscountRule $e, bool $flush = true): void
    {
        $this->getEntityManager()->remove($e);
        if ($flush) {
            $this->getEntityManager()->flush();
        }
    }

    public function findByUuidForOwner(string $uuid, string $entityType, int $entityId): ?DiscountRule
    {
        return $this->findOneBy(['uuid' => $uuid, 'entityType' => $entityType, 'entityId' => $entityId]);
    }

    /** @return DiscountRule[] قوانین فعالِ یک owner (برای موتور). */
    public function findActiveForOwner(string $entityType, int $entityId): array
    {
        return $this->findBy(['entityType' => $entityType, 'entityId' => $entityId, 'active' => true], ['priority' => 'DESC']);
    }

    /**
     * لیست کامل قوانین یک owner (شامل غیرفعال‌ها) برای ادمین، مرتب بر priority.
     * موجودیت‌ها برمی‌گردند تا کنترلر با toArray() قرارداد snake_case فرانت را بدهد.
     * @return DiscountRule[]
     */
    public function findAllForOwner(string $entityType, int $entityId): array
    {
        return $this->createQueryBuilder('r')
            ->where('r.entityType = :t')->setParameter('t', $entityType)
            ->andWhere('r.entityId = :i')->setParameter('i', $entityId)
            ->orderBy('r.priority', 'DESC')->addOrderBy('r.id', 'DESC')
            ->getQuery()->getResult();
    }
}
