// What kjøl is made of, as data.
//
// There are two kinds of thing here, and conflating them was the mistake this file used
// to make — one flat list called "the layers", holding both.
//
//   LAYERS       are LANGUAGES. What kjøl is written in, and what it gives you in each:
//                the Go base, the TypeScript kit, the C base, the Jai modules. A layer is
//                a directory of code you can use on its own.
//
//   COMPOSITIONS are FRAMEWORKS. What you get when the layers are assembled into
//                something that does a job — the two web engines. A composition is not
//                another language; it is a use of them.
//
// Kjøl Wasm Web is Go, all the way down. Kjøl JS Web is TypeScript compiled by a Go
// toolchain — two layers, one framework. Listing that beside "C" as though they were the
// same kind of noun told the reader nothing about either.
//
// This is the JS mirror of app/layers.go. The ids, the order and the taglines match; only
// the ICONS diverge, and they have to — see below.

export interface Layer {
    name: string;
    href: string;
    tagline: string;
    /** Live = you can click into worked examples. Reference = documented, no demo. */
    live: boolean;
    /**
     * The ONE field that does not match app/layers.go, and cannot: the two kits have
     * different icon sets. This side names FontAwesome; the Go side names webui's own
     * hand-drawn registry, which has no FontAwesome in it at all. Where the two have no
     * glyph in common the names diverge.
     *
     * Both sides fail loudly rather than quietly — a name neither registry knows renders
     * an empty box, and app/icons_test.go fails the build over it.
     */
    icon: string;
}

/** Languages: what kjøl is written in. */
export const LANGUAGES: Layer[] = [
    {
        name: "Go",
        href: "/go",
        tagline: "The base: config, database, logging, HTTP, mail, validation — and both web engines.",
        live: false,
        icon: "server",
    },
    {
        name: "TypeScript",
        href: "/ts",
        tagline: "The Solid component kit, the vendored runtime, and the generic scaffolding apps import as @kjol/*.",
        live: false,
        icon: "code",
    },
    {
        name: "C",
        href: "/c",
        tagline: "Arena allocator, counted strings, math, a lexer, a platform layer — and a build system that is a C file.",
        live: true,
        icon: "bolt",
    },
    {
        name: "Jai",
        href: "/jai",
        tagline: "Console rendering. Early.",
        live: false,
        icon: "cube",
    },
];

/** Compositions: what the languages are assembled into. */
export const COMPOSITIONS: Layer[] = [
    {
        name: "Kjøl Wasm Web",
        href: "/wasm",
        tagline: "Web interfaces written in Go, compiled to WebAssembly. SSR + hydration, and no JavaScript build at all.",
        live: true,
        icon: "code",
    },
    {
        name: "Kjøl JS Web",
        href: "/js",
        tagline: "The Solid component kit, bundled by a Go toolchain: TSX → Solid → esbuild, Tailwind in Go.",
        live: true,
        icon: "table-columns",
    },
];

/** The layer or composition the current path belongs to, or undefined on the front page. */
export function currentLayer(path: string): Layer | undefined {
    return [...COMPOSITIONS, ...LANGUAGES].find(
        (l) => path === l.href || path.startsWith(l.href + "/"),
    );
}
