#ifndef INFLOW_BOUNDARY_CONDITION_DESCRIPTOR_HPP
#define INFLOW_BOUNDARY_CONDITION_DESCRIPTOR_HPP

#include <language/utils/FunctionSymbolId.hpp>
#include <mesh/IBoundaryDescriptor.hpp>
#include <scheme/IBoundaryConditionDescriptor.hpp>

#include <memory>

class InflowBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
{
 private:
  std::ostream&
  _write(std::ostream& os) const final
  {
    os << "inflow(" << ',' << *m_boundary_descriptor << ")";
    return os;
  }

  std::shared_ptr<const IBoundaryDescriptor> m_boundary_descriptor;
  const FunctionSymbolId m_function_symbol_id;

 public:
  FunctionSymbolId
  functionSymbolId() const
  {
    return m_function_symbol_id;
  }

  const IBoundaryDescriptor&
  boundaryDescriptor() const final
  {
    return *m_boundary_descriptor;
  }

  Type
  type() const final
  {
    return Type::inflow;
  }

  InflowBoundaryConditionDescriptor(std::shared_ptr<const IBoundaryDescriptor> boundary_descriptor,
                                    const FunctionSymbolId& function_symbol_id)
    : m_boundary_descriptor(boundary_descriptor), m_function_symbol_id{function_symbol_id}
  {
    ;
  }

  InflowBoundaryConditionDescriptor(const InflowBoundaryConditionDescriptor&) = delete;
  InflowBoundaryConditionDescriptor(InflowBoundaryConditionDescriptor&&)      = delete;

  ~InflowBoundaryConditionDescriptor() = default;
};

#endif   // INFLOW_BOUNDARY_CONDITION_DESCRIPTOR_HPP