#pragma once

#include <utility>
#include <vector>
#include <iostream>

struct Node {
    unsigned int ID;
    double x, y, z;
    bool isVertex;

    Node() = default;

    Node(unsigned int p_ID, double p_x, double p_y, double p_z, bool p_isVertex) : ID(p_ID), x(p_x), y(p_y), z(p_z),
                                                                                   isVertex(p_isVertex) {}
};

struct FiniteElement {
    unsigned int ID;
    unsigned int areaID;
    std::vector<unsigned int> nodesID;

    FiniteElement() = default;

    FiniteElement(unsigned int p_ID, unsigned int p_areaID, std::vector<unsigned int> p_nodesID) : ID(p_ID),
        areaID(p_areaID), nodesID(std::move(p_nodesID)) {};
};

struct BoundaryElement {
    unsigned int ID;
    unsigned int boundaryID;
    std::vector<unsigned int> nodesID;

    BoundaryElement() = default;

    BoundaryElement(unsigned int p_ID, unsigned int p_boundaryID, std::vector<unsigned int> p_nodesID) : ID(p_ID),
        boundaryID(p_boundaryID), nodesID(std::move(p_nodesID)) {};
};