#pragma once
#include <string>
#include <vector>

namespace MC {

// A parameterized helix product (e.g., Proses 2.5 R1&R2). Adding a new
// helix kit is a one-entry change to the registry below -- the renderers,
// 3D viewer, palette, and save/load all read from these fields.
//
// CONSTRAINTS:
//   * turns must have a 0.5 fractional component (so the spiral starts on
//     one side and ends on the opposite side, matching the stub layout).
//   * pieces_per_turn is fixed at 12 (one 30 deg piece per slot).
struct HelixVariant {
    std::string id;            // stable key, e.g. "proses_2_5_r1r2"
    std::string displayName;   // shown in the palette
    double      turns;         // total spiral turns (e.g. 2.5, 3.5)
    double      totalRise;     // mm of climb from bottom stub to top stub
    double      radiusR1;      // inner track radius (mm)
    double      radiusR2;      // outer track radius (mm)
    std::string stubCatalog;   // catalog number for the 4 stubs
    std::string innerCurve;    // catalog number for R1 30 deg curve
    std::string outerCurve;    // catalog number for R2 30 deg curve
};

// All known helix variants. Append to add a new product.
const std::vector<HelixVariant>& GetHelixVariants();

// Find a variant by id; returns nullptr if not found.
const HelixVariant* FindHelixVariant(const std::string& id);

// The id of the default variant used when no variant is specified
// (e.g. loading a pre-variant save file).
const std::string& DefaultHelixVariantId();

} // namespace MC
