/**
 * \file    Mimic_Integer.cpp
 * \author  Silvan Murer
 * \date    13 October 2022
 *
 * \brief   Integer class of genSDK GF implementation, based on Mimic_Node
 */

#include "features/Mimic_Integer.hpp"
#include "Mimic_Exception.hpp"

#define GENICAM_NO_AUTO_IMPLIB
#include "GenICam.h"

#include <memory>
#include <string>

using namespace GenApi;

namespace mimic {

Mimic_Integer::Mimic_Integer() : Mimic_Node() { type = Type_e::INTEGER; };
Mimic_Integer::Mimic_Integer(GenApi_3_4::INode* node) : Mimic_Node(node) { type = Type_e::INTEGER; };
Mimic_Integer::~Mimic_Integer() { };

std::variant<int64_t, double, bool, std::string> Mimic_Integer::getVariant(std::string name)
{
    return getValue();
};
void Mimic_Integer::setVariant(std::string name, std::variant<int64_t, double, bool, std::string> value)
{
    try {
        setValue(std::get<int64_t>(value));
    }
    catch (std::bad_variant_access const& e) {
        throw Mimic_Access_Exception(std::string("Node ") + node->GetName().c_str() + " is of type Integer! " + e.what(), -650);
    }
    catch (...) {
        throw Mimic_Access_Exception(std::string("Node ") + node->GetName().c_str() + " read failed!", -610);
    }

}

int64_t Mimic_Integer::getValue()
{
    if (!IsImplemented(node) || !IsAvailable(node) || !IsReadable(node)) {
        throw Mimic_Access_Exception(std::string("Node ") + node->GetName().c_str() + " is not readable!", -600);
    }
    try {
        return dynamic_cast<IInteger*>(node)->GetValue();
    }
    catch (...) {
        throw Mimic_Access_Exception(std::string("Node ") + node->GetName().c_str() + " read failed!", -610);
    }
}
void Mimic_Integer::setValue(int64_t value)
{
    if (!IsImplemented(node) || !IsAvailable(node) || !IsWritable(node)) {
        throw Mimic_Access_Exception(std::string("Node ") + node->GetName().c_str() + " is not writable!", -600);
    }
    try {
        return dynamic_cast<IInteger*>(node)->SetValue(value);
    }
    catch (...) {
        throw Mimic_Access_Exception(std::string("Node ") + node->GetName().c_str() + " write failed!", -610);
    }
}

} /* namespace genSDK */
