<?php

declare(strict_types=1);

namespace App\Administration\Domain\Repository;

use App\Administration\Domain\Model\SchoolClass\AcademicYearId;
use App\Administration\Domain\Model\SchoolClass\ClassId;
use App\Administration\Domain\Model\SchoolClass\ClassName;
use App\Administration\Domain\Model\SchoolClass\SchoolClass;
use App\Shared\Domain\Tenant\TenantId;

interface ClassRepository
{
    public function save(SchoolClass $class): void;

    /**
     * @throws \App\Administration\Domain\Exception\ClasseNotFoundException
     */
    public function get(ClassId $id): SchoolClass;

    public function findById(ClassId $id): ?SchoolClass;

    /**
     * Recherche une classe par nom dans un tenant et une année scolaire.
     */
    public function findByName(
        ClassName $name,
        TenantId $tenantId,
        AcademicYearId $academicYearId,
    ): ?SchoolClass;

    /**
     * Retourne toutes les classes actives d'un tenant pour une année scolaire.
     *
     * @return SchoolClass[]
     */
    public function findActiveByTenantAndYear(
        TenantId $tenantId,
        AcademicYearId $academicYearId,
    ): array;

    /**
     * Supprime une classe du repository.
     */
    public function delete(ClassId $id): void;
}
