from pathlib import Path

root = Path(__file__).resolve().parents[2]

checks = {
    "Chart factory": "Public Function AddChart(Optional configure As Action(Of MASChart) = Nothing) As MASChart",
    "Chart public class": "Partial Public NotInheritable Class MASChart",
    "Chart default kind": "Private _chartKind As MASChartKind = MASChartKind.Line",
    "Chart default title": 'Private _title As String = "Chart"',
    "Chart changed event": "Public Event ChartChanged As EventHandler",
    "Chart create": "Public Shared Function Create() As MASChart",
    "Chart kind name": "Public ReadOnly Property ChartKindName As String",
    "Chart has data": "Public ReadOnly Property HasData As Boolean",
    "Line chart": "Public Function WithLineChart(title As String) As MASChart",
    "Bar chart": "Public Function WithBarChart(title As String) As MASChart",
    "Pie chart": "Public Function WithPieChart(title As String) As MASChart",
    "Donut chart": "Public Function WithDonutChart(title As String) As MASChart",
    "KPI chart": "Public Function WithKpiChart(title As String) As MASChart",
    "Sparkline chart": "Public Function WithSparklineChart(title As String) As MASChart",
    "Clear series no-op": "If _series.Count = 0 Then Return Me",
    "Point finite guard": 'If Not MASChartDataPoint.IsFinite(value) Then Throw New ArgumentOutOfRangeException(NameOf(value), "Chart point value must be finite.")',
    "Trend finite guard": 'If Not MASChartDataPoint.IsFinite(trendValue) Then Throw New ArgumentOutOfRangeException(NameOf(trendValue), "Chart KPI trend value must be finite.")',
    "Series case-insensitive": "String.Equals(draft.SeriesKey, normalizedSeriesKey, StringComparison.OrdinalIgnoreCase)",
    "Point append": "draft.Points.Add(New MASChartPointDraft",
    "Chart change revision": "_revision += 1",
    "No pointer focus": "Protected Overrides Function WantsPointerFocus() As Boolean",
    "No keyboard focus": "Protected Overrides Function WantsKeyboardFocus() As Boolean",
    "Pointer routing exclusion": "Protected Overrides Function ExcludeFromPointerRouting() As Boolean",
    "Desired chart size": "Return New SKSize(360.0F, 220.0F)",
    "Minimum chart size": "Return New SKSize(180.0F, 120.0F)",
    "Empty chart text": 'Dim text As String = "No chart data"',
    "Internal chart enum": "Friend Enum MASChartKind",
}

vb_text = "\n".join(path.read_text(encoding="utf-8", errors="ignore") for path in root.rglob("*.vb"))
failed = [name for name, needle in checks.items() if needle not in vb_text]

doc = root / "docs/reference/controls/charts.md"
if not doc.exists():
    failed.append("documentation file")
else:
    text = doc.read_text(encoding="utf-8")
    for required in (
        "MASChart",
        "Advanced",
        "AddChart",
        "AddTrendPoint",
        "No chart data",
        "MASChartLegend",
        "non-interactive",
    ):
        if required not in text:
            failed.append(f"documentation marker: {required}")

for rel in ("docs/reference-guide.md", "docs/user/controls.md"):
    text = (root / rel).read_text(encoding="utf-8")
    if "controls/charts.md" not in text:
        failed.append(f"navigation link: {rel}")

if failed:
    print("FAILED:", ", ".join(failed))
    raise SystemExit(1)

print(f"Assertions: {len(checks)} passed, 0 failed")
