#include <vector>
#include <string.h>
#include "module.h"

module::module(int x, int y, double temporal_step){
    step = temporal_step;
    sizeX = x;
    sizeY = y;
}

module::module(const module& copy){
    step = copy.step;
    sizeX = copy.sizeX;
    sizeY = copy.sizeY;
}

module::~module(void){
}

//------------------------------------------------------------------------------//
bool module::allocateValues(){
    simTime = 0;
    return(true);
    }

double module::getSizeX(){
    return(sizeX);
}

double module::getSizeY(){
    return(sizeY);
}

bool module::setSizeX(int x){
    bool ret_correct;    
    if (x>0){
        sizeX = x;
        ret_correct=true;
    } else
        ret_correct=false;
    return(ret_correct);
}

bool module::setSizeY(int y){
    bool ret_correct;    
    if (y>0){
        sizeY = y;
        ret_correct=true;
    } else
        ret_correct=false;
    return(ret_correct);
}

bool module::set_step(double temporal_step) {
    bool ret_correct;    
    if (temporal_step>0){
        step = temporal_step;
        ret_correct=true;
    } else
        ret_correct=false;
    return(ret_correct);
}

void module::addOperation(vector <int> ops){
    portArith.push_back(ops);
    }

void module::addID(vector <string> ID){
    modulesID.push_back(ID);
    }

vector<int> module::getOperation(int op){
    return portArith[op];
    }
    
vector<string> module::getID(int ID){
    return modulesID[ID];
    }

int module::getSizeID(){
    return modulesID.size();
    }
    
int module::getSizeArith(){
    return portArith.size();
    }

void module::setModuleID(string s){
    ID=s;
    }
    
string module::getModuleID(){
    return ID;
    }

// Set and get synapse type
void module::addTypeSynapse(int type){
    typeSynapse.push_back(type);
    }
    
int module::getTypeSynapse(int port){
    return typeSynapse[port];
    }

bool module::checkID(const char* name){
    const char * charID = ID.c_str();

    if (strcmp(name,charID) == 0){
        return true;
    }else{
        return false;
    }
}

bool module::isDummy() {
    return true;
    }

// Fn definitions just to avoid errors/warnings
void module::feedInput(double sim_time, const CImg<double>& new_input, bool isCurrent, int port){
    }
    
void module::update(){
    }
    
CImg<double>* module::getOutput(){
    return(NULL);
    }
    
bool module::setParameters(vector<double> params, vector<string> paramID){
    return(true);
    }
    
void module::clearParameters(vector<string> paramID){
    }