#include "opencv2/face.hpp"
#include "face_utils.hpp"
#include "precomp.hpp"

using namespace cv;
using namespace face;

int BasicFaceRecognizer::getNumComponents() const
{
    return _num_components;
}

void BasicFaceRecognizer::setNumComponents(int val)
{
    _num_components = val;
}

double BasicFaceRecognizer::getThreshold() const
{
    return _threshold;
}

void BasicFaceRecognizer::setThreshold(double val)
{
    _threshold = val;
}

std::vector<cv::Mat> BasicFaceRecognizer::getProjections() const
{
    return _projections;
}

cv::Mat BasicFaceRecognizer::getLabels() const
{
    return _labels;
}

cv::Mat BasicFaceRecognizer::getEigenValues() const
{
    return _eigenvalues;
}

cv::Mat BasicFaceRecognizer::getEigenVectors() const
{
    return _eigenvectors;
}

cv::Mat BasicFaceRecognizer::getMean() const
{
    return _mean;
}

void BasicFaceRecognizer::read(const FileNode& fs)
{
    //read matrices
    double _t = 0;
    fs["threshold"] >> _t; // older versions might not have "threshold"
    if (_t !=0)
        _threshold = _t;    // be careful, not to overwrite DBL_MAX with 0 !
    fs["num_components"] >> _num_components;
    fs["mean"] >> _mean;
    fs["eigenvalues"] >> _eigenvalues;
    fs["eigenvectors"] >> _eigenvectors;
    // read sequences
    readFileNodeList(fs["projections"], _projections);
    fs["labels"] >> _labels;
    const FileNode& fn = fs["labelsInfo"];
    if (fn.type() == FileNode::SEQ)
    {
       _labelsInfo.clear();
       for (FileNodeIterator it = fn.begin(); it != fn.end();)
       {
           LabelInfo item;
           it >> item;
           _labelsInfo.insert(std::make_pair(item.label, item.value));
       }
    }
}

void BasicFaceRecognizer::write(FileStorage& fs) const
{
    // write matrices
    fs << "threshold" << _threshold;
    fs << "num_components" << _num_components;
    fs << "mean" << _mean;
    fs << "eigenvalues" << _eigenvalues;
    fs << "eigenvectors" << _eigenvectors;
    // write sequences
    writeFileNodeList(fs, "projections", _projections);
    fs << "labels" << _labels;
    fs << "labelsInfo" << "[";
    for (std::map<int, String>::const_iterator it = _labelsInfo.begin(); it != _labelsInfo.end(); it++)
        fs << LabelInfo(it->first, it->second);
    fs << "]";
}

bool BasicFaceRecognizer::empty() const
{
    return (_labels.empty());
}