#pragma once

#include "fesa/core/status.hpp"
#include "fesa/model/model_types.hpp"

#include <array>
#include <cstddef>
#include <vector>

namespace fesa {

enum class ShellGeometryPointKind {
    center,
    stiffness,
    tying,
    recovery
};

struct ShellGeometryValidationPoint {
    ShellGeometryPointKind kind;
    std::size_t locationIndex;
    std::array<double, 3> naturalCoordinates;
};

struct ShellElementGeometryData {
    EntityIndex elementIndex;
    std::array<double, 3> normalCandidate;
    double surfaceAreaWeight;
};

struct ShellGeometry {
    std::vector<ShellNodeInitialFrame> nodalFrames;
    std::vector<ShellElementGeometryData> elementData;
};

const std::array<ShellGeometryValidationPoint, 17>&
shellGeometryValidationPoints() noexcept;

Result<ShellGeometry> preprocessShellGeometry(
    const std::vector<Node>& nodes,
    const std::vector<Mitc4ShellDefinition>& elements,
    const std::vector<ShellSection>& sections);

} // namespace fesa
