using TMSDAL.DTO.Assessment; using TMSDAL.DTO.AttemptResponse; namespace TMSBLL.Assessment { public class EvaluationResultDTO { // False means "not evaluated" — the response stays pending (IsCorrect = -1) for a human // grader via the existing EvaluateAssessmentAttempt endpoint. The default // AssessmentAnswerEvaluationService always returns this. public bool Evaluated { get; set; } public bool IsCorrect { get; set; } public short MarksAwarded { get; set; } } // Extension point for AI-assisted evaluation of subjective (non-objective) answers — e.g. // essay-type ShortAnswer questions flagged RequiresManualEvaluation. The default // implementation is a no-op (response stays pending for a human grader); a real AI evaluator // is registered later purely via DI, with no change to SubmitAssessmentAttempt's calling code. public interface IAssessmentAnswerEvaluationService { Task EvaluateAsync(AttemptResponseDTO response, AssessmentQuestionDTO question, CancellationToken ct); } // Named to match assembly-scan's Foo->IFoo auto-registration convention (AsMatchingInterface) — // a "NoOp"-prefixed name here would silently fail to register, leaving AssessmentAttemptBLL // unconstructable (confirmed live via HRFinanceHost's /health DI pre-flight check). public class AssessmentAnswerEvaluationService : IAssessmentAnswerEvaluationService { public Task EvaluateAsync(AttemptResponseDTO response, AssessmentQuestionDTO question, CancellationToken ct) => Task.FromResult(new EvaluationResultDTO { Evaluated = false }); } }