namespace DramaLing.Api.Services; /// /// 測驗模式選擇服務介面 /// public interface IReviewModeSelector { List GetPlannedTests(string userCEFRLevel, string wordCEFRLevel); string GetNextTestType(List plannedTests, List completedTestTypes); } /// /// 測驗模式選擇服務實現 /// public class ReviewModeSelector : IReviewModeSelector { private readonly ILogger _logger; public ReviewModeSelector(ILogger logger) { _logger = logger; } /// /// 根據CEFR等級獲取預定的測驗類型列表 /// public List GetPlannedTests(string userCEFRLevel, string wordCEFRLevel) { var userLevel = GetCEFRLevel(userCEFRLevel); var wordLevel = GetCEFRLevel(wordCEFRLevel); var difficulty = wordLevel - userLevel; _logger.LogDebug("Planning tests for user {UserCEFR} vs word {WordCEFR}, difficulty: {Difficulty}", userCEFRLevel, wordCEFRLevel, difficulty); if (userCEFRLevel == "A1") { // A1學習者:基礎保護機制 return new List { "flip-memory", "vocab-choice", "vocab-listening" }; } else if (difficulty < -10) { // 簡單詞彙:應用練習 return new List { "sentence-fill", "sentence-reorder" }; } else if (difficulty >= -10 && difficulty <= 10) { // 適中詞彙:全方位練習 return new List { "sentence-fill", "sentence-reorder", "sentence-speaking" }; } else { // 困難詞彙:基礎重建 return new List { "flip-memory", "vocab-choice" }; } } /// /// 獲取下一個測驗類型 /// public string GetNextTestType(List plannedTests, List completedTestTypes) { var nextTest = plannedTests.FirstOrDefault(test => !completedTestTypes.Contains(test)); return nextTest ?? string.Empty; } /// /// CEFR等級轉換為數值 /// private int GetCEFRLevel(string cefrLevel) { return cefrLevel switch { "A1" => 20, "A2" => 35, "B1" => 50, "B2" => 65, "C1" => 80, "C2" => 95, _ => 50 // 預設B1 }; } }