/*******************************************************************************
 * Copyright (c) 2015-2017 ONERA and IRT AESE (IRT Saint Exupéry).
 * Ce logiciel est la propriété de l’ONERA (the French Aerospace Lab) et de
 * l'IRT AESE (IRT Saint Exupéry).
 * Tous droits réservés.
 *
 * Ce programme et les éléments qui l'accompagnent sont mis à disposition
 * aux conditions définies par le contrat de licence logiciel CeCILL-C soumise
 * au droit français et respectant les principes de diffusion des logiciels libres.
 * Vous pouvez utiliser, modifier et/ou redistribuer ce programme
 * sous les conditions de la licence CeCILL-C (http://www.cecill.info).

 * This software is property of ONERA (the French Aerospace Lab) and of
 * the IRT AESE (IRT Saint Exupéry).
 * All rights reserved.
 *
 * This program and the accompanying materials are made available under
 * the terms of the CeCILL-C license under French law and
 * abiding by the rules of distribution of free software.
 * You can  use, modify and/ or redistribute the software under the terms of
 * the CeCILL-C license (http://www.cecill.info).
 *
 * Contributeurs/contributors:
 *     Guillaume Infantes (ONERA - Centre de Toulouse) - initial API and implementation
 *     Alexandre Albore (IRT Saint-Exupéry) - Altarica/Fiacre translation
 *
 *******************************************************************************/

#include "Assignment.hh"
#include "Node.hh"
#include <iostream>
#include "expressions/Expression.hh"

using namespace epoch::altarica;


// void Assignment::matchVariable(bool init) {
    // std::cerr << "matching variable " << *(ma_->toString());
    // std::cerr << " of node " << *(n_->getMA()->toString());
    //    Variable *v = n_->findVariableByName(ma_);
//     if (init)
// 	n_->findVariableByName(ma_)->setInit(this);
// }


Value * Assignment::evaluate(const AltaricaModel *am, AltaricaState * m, const Node *n) const {
    return e_->evaluate(am,m,n);
}

Value * Assignment::evaluate(const AltaricaModel *am, AltaricaState * m) const {
    return e_->evaluate(am, m,n_);
}


void Assignment::setNode(Node*n) {
    n_ = n;
    // if (n_ != NULL)
    // 	matchVariable(false);
    if (n_ != NULL) {
	v_ =  n_->findVariableByName(ma_);
	if (v_ == NULL) {
	    std::cerr << "COULD NOT MATCH VARIABLE " << ma_->toString() << " in node " << n_->toString() <<
		" in assignment " << ma_->toString() << " := " << e_->toString() << std::endl;
	    exit(-1);
	}
    }
}





void Assignment::deleteExprs() {
    delete e_;
    //    delete oe_;
}

Assignment::~Assignment() {
    delete ma_;
}
