const COLOR_BG: Record<string, string> = {
    moss: "bg-moss",
    "deep-sea": "bg-deep-sea",
    sunflower: "bg-sunflower",
    valencia: "bg-valencia",
};

const COLOR_TEXT: Record<string, string> = {
    moss: "text-moss",
    "deep-sea": "text-deep-sea",
    sunflower: "text-sunflower",
    valencia: "text-valencia",
};

const COLOR_BORDER: Record<string, string> = {
    moss: "border-moss",
    "deep-sea": "border-deep-sea",
    sunflower: "border-sunflower",
    valencia: "border-valencia",
};

export function masteryBg(color: string): string {
    return COLOR_BG[color] ?? "bg-muted";
}

export function masteryText(color: string): string {
    return COLOR_TEXT[color] ?? "text-foreground";
}

export function masteryBorder(color: string): string {
    return COLOR_BORDER[color] ?? "border-border";
}

export function getMasteryColor(label: string): string {
    if (label.includes("Exceeding")) return "bg-moss/20 text-moss border-moss/30";
    if (label.includes("Meeting")) return "bg-deep-sea/20 text-deep-sea border-deep-sea/30";
    if (label.includes("Approaching")) return "bg-sunflower/20 text-sunflower border-sunflower/30";
    if (label.includes("Not Yet")) return "bg-valencia/20 text-valencia border-valencia/30";
    if (label === "✔") return "bg-moss/20 text-moss border-moss/30";
    return "bg-muted text-muted-foreground border-border";
}

export function getMasteryDot(label: string): string {
    if (label.includes("Exceeding") || label === "✔") return "bg-moss";
    if (label.includes("Meeting")) return "bg-deep-sea";
    if (label.includes("Approaching")) return "bg-sunflower";
    if (label.includes("Not Yet")) return "bg-valencia";
    return "bg-muted";
}

export function scoreBg(score: number): string {
    if (score === 4) return "bg-moss";
    if (score === 3) return "bg-deep-sea";
    if (score === 2) return "bg-sunflower";
    return "bg-valencia";
}

export function parseMasteryLevel(label: string): number {
    const match = label.match(/^(\d+)/);
    if (match) return Number(match[1]);
    return 0;
}

export function str(value: unknown, fallback = ""): string {
    return typeof value === "string" ? value : fallback;
}

export function num(value: unknown, fallback = 0): number {
    if (typeof value === "number" && Number.isFinite(value)) return value;
    if (typeof value === "string" && value.trim() !== "" && Number.isFinite(Number(value))) {
        return Number(value);
    }
    return fallback;
}
