<?php

declare(strict_types=1);

namespace App\Administration\Domain\Repository;

use App\Administration\Domain\Model\SchoolClass\SchoolId;
use App\Administration\Domain\Model\Subject\Subject;
use App\Administration\Domain\Model\Subject\SubjectCode;
use App\Administration\Domain\Model\Subject\SubjectId;
use App\Shared\Domain\Tenant\TenantId;

interface SubjectRepository
{
    public function save(Subject $subject): void;

    /**
     * @throws \App\Administration\Domain\Exception\SubjectNotFoundException
     */
    public function get(SubjectId $id): Subject;

    public function findById(SubjectId $id): ?Subject;

    /**
     * Recherche une matière par code dans un tenant et une école.
     */
    public function findByCode(
        SubjectCode $code,
        TenantId $tenantId,
        SchoolId $schoolId,
    ): ?Subject;

    /**
     * Retourne toutes les matières actives d'un tenant et une école.
     *
     * @return Subject[]
     */
    public function findActiveByTenantAndSchool(
        TenantId $tenantId,
        SchoolId $schoolId,
    ): array;

    /**
     * Supprime une matière du repository.
     */
    public function delete(SubjectId $id): void;
}
