<?php

namespace App\Repository;

use App\Entity\FactureLigne;
use App\Entity\Equipement;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\OptimisticLockException;
use Doctrine\ORM\ORMException;
use Doctrine\Persistence\ManagerRegistry;

/**
 * @extends ServiceEntityRepository<FactureLigne>
 *
 * @method FactureLigne|null find($id, $lockMode = null, $lockVersion = null)
 * @method FactureLigne|null findOneBy(array $criteria, array $orderBy = null)
 * @method FactureLigne[]    findAll()
 * @method FactureLigne[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
 */
class FactureLigneRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, FactureLigne::class);
    }

    /**
     * @throws ORMException
     * @throws OptimisticLockException
     */
    public function add(FactureLigne $entity, bool $flush = true): void
    {
        $this->_em->persist($entity);
        if ($flush) {
            $this->_em->flush();
        }
    }

    /**
     * @throws ORMException
     * @throws OptimisticLockException
     */
    public function remove(FactureLigne $entity, bool $flush = true): void
    {
        $this->_em->remove($entity);
        if ($flush) {
            $this->_em->flush();
        }
    }



    public function getPiecesChangeesByEquipement(Equipement $equipement)
    {
        $twoYears = date('d/m/Y', strtotime("-2 year"));
        $fiveYears = date('d/m/Y', strtotime("-5 year"));
        $queryBuilder = $this->createQueryBuilder('fl');
        $expr = $queryBuilder->expr();
        $request = $queryBuilder
            ->leftJoin('fl.facture', 'f')
            ->leftJoin('fl.produit', 'p')
            ->leftJoin('fl.produit_facture_affectation', 'pfa')
            ->where($expr->in('f.equipement',  ':ids'))
            ->andWhere("((f.date_facture > :twoYears AND p.gu_etendue = false) OR (f.date_facture > :fiveYears AND p.gu_etendue = true))")
            ->andWhere("pfa.libelle_court IN ('F','GT')")
            ->setParameter('ids', $equipement->getId())
            ->setParameter('twoYears', $twoYears)
            ->setParameter('fiveYears', $fiveYears)
            ->getQuery();

        return $request->getResult() ;
    }
}
