<?php

namespace App\Repository;

use App\Entity\OptionTarif;
use App\Entity\Option;
use App\Entity\EquipementType;
use App\Entity\ContratPlage;
use DateTime;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;

/**
 * @method OptionTarif|null find($id, $lockMode = null, $lockVersion = null)
 * @method OptionTarif|null findOneBy(array $criteria, array $orderBy = null)
 * @method OptionTarif[]    findAll()
 * @method OptionTarif[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
 */
class OptionTarifRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, OptionTarif::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'])
            ->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 getOptionTarifEquipement($option, $equipementType, $contratType, $contratPlage) {

        $qb =  $this->createQueryBuilder('ot')
            ->andWhere('ot.option = :option')
            ->andWhere('ot.equipement_type = :equipement_type')
            ->andWhere('ot.contrat_type = :contrat_type')
            ->andWhere('ot.date_debut <= :date')
            ->andWhere('ot.date_fin >= :date OR ot.date_fin is null')
            ->setParameter('option', $option)
            ->setParameter('equipement_type', $equipementType)
            ->setParameter('contrat_type', $contratType)
            ->setParameter('date', new DateTime())
        ;

        if ($contratPlage) {
            $qb
                ->andWhere('ot.contrat_plage = :contrat_plage')
                ->setParameter('contrat_plage', $contratPlage);
        } else {
            $qb->andWhere('ot.contrat_plage is null');
        }

        return $qb->getQuery()
            ->getResult();

    }


    public function getOptionTarifForContrat(Option $option, EquipementType $equipementType, ContratPlage $contratPlage = null)
    {
        $qb =  $this->createQueryBuilder('ot')
            ->andWhere('ot.option = :option')
            ->andWhere('ot.equipement_type = :equipement_type')
            ->andWhere('ot.date_debut <= :date')
            ->andWhere('ot.date_fin >= :date OR ot.date_fin is null')
            ->setParameter('option', $option)
            ->setParameter('equipement_type', $equipementType)
            ->setParameter('date', new DateTime())
        ;

        if ($contratPlage) {
            $qb
                ->andWhere("((ot.contrat_type IN ('3','4') AND ot.contrat_plage IS NULL) OR (ot.contrat_type NOT IN ('3','4') AND ot.contrat_plage = :contrat_plage))")
                ->setParameter('contrat_plage', $contratPlage);
        } else {
            $qb->andWhere('ot.contrat_plage is null');
        }

        return $qb->getQuery()
            ->getResult();
    }

}