<?php

namespace App\Repository;

use App\Entity\SecteurTarif;
use App\Entity\Produit;
use App\Entity\SecteurZone;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;

/**
 * @method SecteurTarif|null find($id, $lockMode = null, $lockVersion = null)
 * @method SecteurTarif|null findOneBy(array $criteria, array $orderBy = null)
 * @method SecteurTarif[]    findAll()
 * @method SecteurTarif[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
 */
class SecteurTarifRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, SecteurTarif::class);
    }

    public function deleteByPeriode($periode)
    {
        $qb = $this->createQueryBuilder('ct')
            ->delete();

        if (isset($periode['date_debut'])) {
            $qb->andWhere('ct.date_debut = :date_debut')->setParameter(':date_debut', $periode['date_debut']);
        }
        if (isset($periode['date_fin'])) {
            $qb->andWhere('ct.date_fin = :date_fin')->setParameter(':date_fin', $periode['date_fin']);
        }
        return $qb->getQuery()->getResult();
    }

    public function updateLastPeriode($periode) {
        return $this->createQueryBuilder('ct')
            ->update()
            ->set('ct.date_fin', 'null')
            ->andWhere('ct.date_fin = :date_debut')
            ->setParameter('date_debut', $periode['date_debut_1_day'])
            ->getQuery()
            ->getSingleScalarResult()
            ;
    }

    public function addDateFin($date_fin)
    {
        return $this->createQueryBuilder('ct')
            ->update()
            ->set('ct.date_fin', ':date_fin')
            ->setParameter('date_fin', $date_fin)
            ->where('ct.date_fin is null')
            ->getQuery()
            ->getSingleScalarResult()
            ;
    }

    public function majField($field, $old_value, $new_value)
    {
        return $this->createQueryBuilder('ct')
            ->update()
            ->set('ct.' . $field, ':new_value')
            ->setParameter('new_value', $new_value)
            ->where('ct.' . $field . ' = :old_value')
            ->setParameter('old_value', $old_value)
            ->getQuery()
            ->getSingleScalarResult();
    }

    public function getOrderByDateProduit() {
        return $qb = $this->createQueryBuilder('ct')
            ->innerJoin('ct.produit', 'p')
            ->addOrderBy('ct.date_debut', 'DESC')
            ->addOrderBy('p.designation', 'ASC')
            ->getQuery()
            ->getResult();
    }



    public function getSecteurTarif(Produit $produit, SecteurZone $secteurZone) {
        $qb = $this->createQueryBuilder('sz');
        $expr = $qb->expr();
        $qb
            ->select('p.id as id, p.code as code, p.designation as designation, p.gtin as gtin, p.gu_etendue as gu_etendue, sz.tarif_ht_deplacement as prix_ht')
            ->innerJoin('sz.produit', 'p')
            ->where("sz.produit = :produit")
            ->andWhere("sz.secteur_zone = :secteurZone")
            ->andWhere("sz.date_fin IS null")
            ->setParameter('produit', $produit)
            ->setParameter('secteurZone', $secteurZone);
        $query = $qb->getQuery();
        return $query->getResult();
    }
}
