using System.Collections.Generic;
using System.Linq;
namespace DramaLing.Api.Utils
{
///
/// CEFR 等級轉換和比較輔助類別
/// 處理字串格式 (A1, A2, B1, B2, C1, C2) 與數字格式 (0-6) 的轉換
///
public static class CEFRHelper
{
///
/// CEFR 等級映射表
/// 0 = 未知/完全沒概念
/// 1-6 = A1 到 C2
///
private static readonly Dictionary LevelToNumericMap = new()
{
["A0"] = 0,
["A1"] = 1,
["A2"] = 2,
["B1"] = 3,
["B2"] = 4,
["C1"] = 5,
["C2"] = 6
};
///
/// 數字到字串的反向映射
///
private static readonly Dictionary NumericToLevelMap =
LevelToNumericMap.ToDictionary(kvp => kvp.Value, kvp => kvp.Key);
///
/// 將 CEFR 字串等級轉換為數字
///
/// CEFR 等級字串 (A1, A2, B1, B2, C1, C2)
/// 數字等級 (0=未知, 1-6=A1-C2)
public static int ToNumeric(string? level)
{
if (string.IsNullOrWhiteSpace(level))
return 0;
var normalizedLevel = level.Trim().ToUpper();
return LevelToNumericMap.TryGetValue(normalizedLevel, out var numeric) ? numeric : 0;
}
///
/// 將數字等級轉換為 CEFR 字串
///
/// 數字等級 (0-6)
/// CEFR 等級字串,無效值返回 "Unknown"
public static string ToString(int level)
{
return NumericToLevelMap.TryGetValue(level, out var cefr) ? cefr : "Unknown";
}
///
/// 比較兩個等級:level1 是否高於 level2
///
/// 等級1 (數字)
/// 等級2 (數字)
/// level1 > level2
public static bool IsHigherThan(int level1, int level2)
{
return level1 > level2;
}
///
/// 比較兩個等級:level1 是否低於 level2
///
/// 等級1 (數字)
/// 等級2 (數字)
/// level1 < level2
public static bool IsLowerThan(int level1, int level2)
{
return level1 < level2;
}
///
/// 比較兩個等級是否相同
///
/// 等級1 (數字)
/// 等級2 (數字)
/// level1 == level2
public static bool IsSameLevel(int level1, int level2)
{
return level1 == level2;
}
///
/// 字串版本:比較兩個 CEFR 等級
///
/// 等級1 (字串)
/// 等級2 (字串)
/// level1 > level2
public static bool IsHigherThan(string? level1, string? level2)
{
return IsHigherThan(ToNumeric(level1), ToNumeric(level2));
}
///
/// 字串版本:比較兩個 CEFR 等級
///
/// 等級1 (字串)
/// 等級2 (字串)
/// level1 < level2
public static bool IsLowerThan(string? level1, string? level2)
{
return IsLowerThan(ToNumeric(level1), ToNumeric(level2));
}
///
/// 字串版本:比較兩個 CEFR 等級是否相同
///
/// 等級1 (字串)
/// 等級2 (字串)
/// level1 == level2
public static bool IsSameLevel(string? level1, string? level2)
{
return IsSameLevel(ToNumeric(level1), ToNumeric(level2));
}
///
/// 驗證數字等級是否有效
///
/// 數字等級
/// 是否在 0-6 範圍內
public static bool IsValidNumericLevel(int level)
{
return level >= 0 && level <= 6;
}
///
/// 驗證字串等級是否有效
///
/// 字串等級
/// 是否為有效的 CEFR 等級
public static bool IsValidStringLevel(string? level)
{
if (string.IsNullOrWhiteSpace(level))
return false;
var normalizedLevel = level.Trim().ToUpper();
return LevelToNumericMap.ContainsKey(normalizedLevel);
}
///
/// 取得所有有效的數字等級
///
/// 數字等級陣列 (0-6)
public static int[] GetAllNumericLevels()
{
return new int[] { 0, 1, 2, 3, 4, 5, 6 };
}
///
/// 取得所有有效的字串等級
///
/// CEFR 等級字串陣列
public static string[] GetAllStringLevels()
{
return new string[] { "A1", "A2", "B1", "B2", "C1", "C2" };
}
}
}