<?php
namespace App\Service;
use App\Entity\Adresse;
use App\Entity\AdresseComplement;
use App\Entity\CategoriePro;
use App\Entity\Client;
use App\Entity\ClientAdresse;
use App\Entity\ClientSite;
use App\Entity\ContratPlage;
use App\Entity\ContratRegroupement;
use App\Entity\ContratTarif;
use App\Entity\ContratType;
use App\Entity\Equipement;
use App\Entity\EquipementFamille;
use App\Entity\EquipementPuissance;
use App\Entity\EquipementType;
use App\Entity\EquipementTypePuissance;
use App\Entity\EtatCivil;
use App\Entity\LockEntites;
use App\Entity\Option;
use App\Entity\OptionTarif;
use App\Entity\Produit;
use App\Entity\ProduitPrestationTarif;
use App\Entity\ProduitTarif;
use App\Entity\ProduitType;
use App\Entity\SecteurTarif;
use App\Entity\SecteurZone;
use App\Entity\Site;
use App\Entity\TypeClient;
use App\Entity\TypeComplementAdresse;
use Cassandra\Date;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use App\Utils\Functions as func;
use Symfony\Flex\Lock;

/**
 * Created by PhpStorm.
 * User: m.dauphin
 * Date: 28/02/2022
 * Time: 17:50
 */

class LockManager
{

    private $em;

    public function __construct(EntityManagerInterface $em) {
        $this->em = $em;
    }

    public function checkLock($nom_entite,$id_entite,$utilisateur) {

        $lock = $this->em->getRepository(LockEntites::class)->findOneBy([
            'nom_entite' => $nom_entite,
            'id_entite' => $id_entite
        ]);
        if ($lock) {
            //on réinitialise le lock
            if ($lock->getUtilisateur() == $utilisateur) {
                $lock->setDateDebut(new DateTime());
                $this->em->persist($lock);
            }
        } else {
            //on crée le lock
            $lock = new LockEntites();
            $lock->setDateDebut(new DateTime());
            $lock->setUtilisateur($utilisateur);
            $lock->setIdEntite($id_entite);
            $lock->setNomEntite($nom_entite);
            $this->em->persist($lock);
        }
        $this->em->flush();

        return $lock;

    }

    public function deleteLock($nom_entite,$id_entite,$utilisateur) {
        $lock = $this->em->getRepository(LockEntites::class)->findOneBy([
            'nom_entite' => $nom_entite,
            'id_entite' => $id_entite,
            'utilisateur' => $utilisateur
        ]);

        if ($lock) {
            $this->em->remove($lock);
            $this->em->flush();
        }
    }

    public function getByUserEntite($nom_entite,$utilisateur) {
        $formattedLocks = [];
        $locks = $this->em->getRepository(LockEntites::class)->findBy(['nom_entite' => $nom_entite, 'utilisateur'=> $utilisateur]);
        if ($locks) {
            foreach ($locks as $lock) {
                $formattedLocks[$lock->getIdEntite()] = $lock;
            }
        }
        return $formattedLocks;
    }

}