<?php

declare(strict_types=1);

namespace App\Administration\Domain\Repository;

use App\Administration\Domain\Model\StudentGuardian\StudentGuardian;
use App\Administration\Domain\Model\StudentGuardian\StudentGuardianId;
use App\Administration\Domain\Model\User\UserId;
use App\Shared\Domain\Tenant\TenantId;

interface StudentGuardianRepository
{
    public function save(StudentGuardian $link): void;

    /**
     * @throws \App\Administration\Domain\Exception\StudentGuardianNotFoundException
     */
    public function get(StudentGuardianId $id, TenantId $tenantId): StudentGuardian;

    /**
     * Retourne les parents/tuteurs liés à un élève.
     *
     * @return StudentGuardian[]
     */
    public function findGuardiansForStudent(UserId $studentId, TenantId $tenantId): array;

    /**
     * Retourne les élèves liés à un parent/tuteur.
     *
     * @return StudentGuardian[]
     */
    public function findStudentsForGuardian(UserId $guardianId, TenantId $tenantId): array;

    /**
     * Compte le nombre de parents/tuteurs liés à un élève.
     */
    public function countGuardiansForStudent(UserId $studentId, TenantId $tenantId): int;

    /**
     * Recherche une liaison existante entre un parent et un élève.
     */
    public function findByStudentAndGuardian(
        UserId $studentId,
        UserId $guardianId,
        TenantId $tenantId,
    ): ?StudentGuardian;

    public function delete(StudentGuardianId $id, TenantId $tenantId): void;
}
