"use client"; import { useEffect, useState } from "react"; import { AuthGuard } from "@/components/auth/AuthGuard"; import { Navbar } from "@/components/layout/Navbar"; import { BottomNav } from "@/components/layout/BottomNav"; import { Spinner } from "@/components/ui/Spinner"; import { api } from "@/lib/api"; interface Rule { value: unknown; description: string; category: string; } const CATEGORY_LABELS: Record = { rep_floors: "Rep Floors", duration: "Duration", superset: "Superset Structure", coherence: "Workout Coherence", }; const CATEGORY_ORDER = ["rep_floors", "duration", "superset", "coherence"]; function formatValue(value: unknown): string { if (typeof value === "boolean") return value ? "Yes" : "No"; if (typeof value === "number") return String(value); if (typeof value === "string") return value.replace(/_/g, " "); return String(value); } export default function RulesPage() { const [rules, setRules] = useState | null>(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); useEffect(() => { async function fetchRules() { try { const data = await api.getRules(); setRules(data); } catch (err) { setError(err instanceof Error ? err.message : "Failed to load rules"); } finally { setLoading(false); } } fetchRules(); }, []); // Group rules by category const grouped: Record = {}; if (rules) { for (const [key, rule] of Object.entries(rules)) { const cat = rule.category; if (!grouped[cat]) grouped[cat] = []; grouped[cat].push([key, rule]); } } const sortedCategories = CATEGORY_ORDER.filter((c) => grouped[c]); return (

Generation Rules

These guardrails are enforced during workout generation to ensure quality and coherence.

{loading ? (
) : error ? (
{error}
) : (
{sortedCategories.map((category) => (

{CATEGORY_LABELS[category] || category}

{grouped[category].map(([key, rule]) => (

{rule.description}

{key}

{formatValue(rule.value)}
))}
))}
)}
); }