#pragma once

#include <string>
#include <vector>

#include <graphene/geometry/Point_set.h>

namespace graphene
{
namespace surface_mesh
{

//
// Bundles all data to be passed to Template- or PoseFitting
//
struct Fitting_target
{
    geometry::Point_set* point_set;
    std::vector<Mat4f>* pose_vector;
    std::string landmark_property_name;
    std::string landmark_weight_property_name;
    std::string vertexweighting_property_name;
    std::string fn_template_ik_dof;
    double landmark_weight_ik;
    bool optimize_scale;
    bool no_transform;

    explicit Fitting_target()
        : point_set(nullptr),
          pose_vector(nullptr),
          landmark_property_name(""),
          landmark_weight_property_name(""),
          vertexweighting_property_name(""),
          fn_template_ik_dof(""),
          landmark_weight_ik(20.0),
          optimize_scale(true),
          no_transform(false)
    {
    }

    Fitting_target(const Fitting_target& other)
    {
        this->point_set = other.point_set;
        this->pose_vector = other.pose_vector;
        this->landmark_property_name = other.landmark_property_name;
        this->landmark_weight_property_name = other.landmark_weight_property_name;
        this->vertexweighting_property_name = other.vertexweighting_property_name;
        this->fn_template_ik_dof = other.fn_template_ik_dof;
        this->landmark_weight_ik = other.landmark_weight_ik;
        this->optimize_scale = other.optimize_scale;
        this->no_transform = other.no_transform;
    }
};

}
}
