#pragma once

#include "fesa/model/domain.hpp"

#include <vector>

namespace fesa {

// Provides the sole active-step view while the referenced Domain retains all
// semantic ownership and must outlive this object.
class AnalysisModel {
public:
    static Result<AnalysisModel> create(const Domain& domain);

    const Domain& domain() const noexcept;
    const StaticStepDefinition& step() const noexcept;
    const std::vector<EntityIndex>& activeElements() const noexcept;
    const std::vector<EntityIndex>& activeMaterials() const noexcept;
    const std::vector<EntityIndex>& activeSections() const noexcept;
    const std::vector<EntityIndex>& activeBoundaryConditions() const noexcept;
    const std::vector<EntityIndex>& activeLoads() const noexcept;

private:
    explicit AnalysisModel(const Domain& domain);

    const Domain* domain_;
    std::vector<EntityIndex> activeElements_;
    std::vector<EntityIndex> activeMaterials_;
    std::vector<EntityIndex> activeSections_;
    std::vector<EntityIndex> activeBoundaryConditions_;
    std::vector<EntityIndex> activeLoads_;
};

} // namespace fesa
