<?php

declare(strict_types=1);

namespace App\Repository;

use App\Entity\AnneeScolaire;
use App\Entity\Classe;
use App\Entity\Etudiant;
use App\Entity\ParcoursEtudiant;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;

/** @extends ServiceEntityRepository<ParcoursEtudiant> */
final class ParcoursEtudiantRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, ParcoursEtudiant::class);
    }

    /** @return list<ParcoursEtudiant> */
    public function findActiveByEtudiant(Etudiant $etudiant): array
    {
        return $this->createQueryBuilder('parcours')
            ->leftJoin('parcours.anneeScolaire', 'annee')->addSelect('annee')
            ->leftJoin('parcours.section', 'section')->addSelect('section')
            ->leftJoin('parcours.niveau', 'niveau')->addSelect('niveau')
            ->leftJoin('parcours.classe', 'classe')->addSelect('classe')
            ->andWhere('parcours.etudiant = :etudiant')
            ->andWhere('parcours.actif = :active')
            ->setParameter('etudiant', $etudiant)
            ->setParameter('active', true)
            ->orderBy('parcours.principal', 'DESC')
            ->addOrderBy('parcours.createdAt', 'DESC')
            ->addOrderBy('parcours.id', 'DESC')
            ->getQuery()
            ->getResult();
    }

    public function existsActiveForStudentClass(Etudiant $etudiant, ?AnneeScolaire $anneeScolaire, Classe $classe): bool
    {
        $qb = $this->createQueryBuilder('parcours')
            ->select('COUNT(parcours.id)')
            ->andWhere('parcours.etudiant = :etudiant')
            ->andWhere('parcours.classe = :classe')
            ->andWhere('parcours.actif = :active')
            ->andWhere('parcours.statut = :statut')
            ->setParameter('etudiant', $etudiant)
            ->setParameter('classe', $classe)
            ->setParameter('active', true)
            ->setParameter('statut', ParcoursEtudiant::STATUT_ACTIF);

        if ($anneeScolaire) {
            $qb->andWhere('parcours.anneeScolaire = :annee')->setParameter('annee', $anneeScolaire);
        } else {
            $qb->andWhere('parcours.anneeScolaire IS NULL');
        }

        return (int) $qb->getQuery()->getSingleScalarResult() > 0;
    }
}
