using GB5Shared.DTO.Framework.Criteria;
using GB5Shared.DTO.Framework.Login;
using TMSDAL.DTO.TrainingEnrollment;
namespace TMSDAL.CustomCode.TrainingEnrollment
{
public interface ITrainingEnrollmentDAL
{
// ════════════════════════════════════════════════════════════════════
// READ
// ════════════════════════════════════════════════════════════════════
/// Fetch full enrollment record by primary key.
Task GetTrainingEnrollment(int enrollmentId, LoginDTO loginDTO);
///
/// Fetch ACTIVE enrollment by (InstanceId + EmployeeId + TenantId).
/// Returns null if no active enrollment exists.
/// Withdrawn / Rejected rows excluded — re-enrollment after those states is allowed.
///
Task GetEnrollment(int instanceId, int employeeId, LoginDTO loginDTO);
/// All enrollments for a training instance (JSON).
Task GetEnrollmentsByInstance(int instanceId, LoginDTO loginDTO);
/// All enrollments for an employee (JSON).
Task GetEnrollmentsByEmployee(int employeeId, LoginDTO loginDTO);
/// Full tenant enrollment list (JSON).
Task GetEnrollmentList(LoginDTO loginDTO);
/// Paged / filtered dropdown select-list (JSON).
Task GetSelectList(CriteriaDTO criteriaDTO, LoginDTO loginDTO, CancellationToken ct);
///
/// Next available waitlist position for an instance.
/// Returns MAX(WaitlistPosition) + 1, or 1 if none waitlisted.
///
Task GetNextWaitlistPosition(int instanceId, LoginDTO loginDTO);
// ════════════════════════════════════════════════════════════════════
// WRITE
// ════════════════════════════════════════════════════════════════════
///
/// Insert a new enrollment. Returns Task — rows-affected not meaningful here.
///
Task SaveTrainingEnrollment(TrainingEnrollmentDTO dto, LoginDTO loginDTO);
///
/// Unified Manager + HR approval / rejection.
/// ApprovalType on the DTO routes to the correct query and column set.
///
Task UpdateApproval(ApprovalUpdateDTO approvalDto, LoginDTO loginDTO);
///
/// Withdraw an enrollment.
/// Status must always be EnrollmentStatus.Withdrawn — enforced by BLL.
///
Task WithdrawEnrollment(int enrollmentId, byte status, string? reason, LoginDTO loginDTO);
///
/// Soft-delete: sets STATUS = 0.
/// Hard delete not permitted — history must be preserved.
///
Task DeleteTrainingEnrollment(int enrollmentId, LoginDTO loginDTO);
}
}