#ifndef NS_LAYER_HH
#define NS_LAYER_HH

#include <vector>
#include <string>
#include <functional>

using std::vector;
using std::string;

#include "NsPattern.hh"

#include "NsUnit.hh"

class NsLayer {
public:
    NsLayer(const string &id, const string &type);
    void makePattern(const string &patId);
    void setPattern(const string &patId);
    void setPattern(const NsPattern &pat);
    void clearPatterns();
    const string &setRandomPattern();
    void clear();
    void randomize();
    void computeNewActivations();
    void applyNewActivations();
    void adjustInhibition();
    void setFrozen(bool state);
    void lesion();
    void maintain();
    uint getNumActive() const;
    static void printScoreHdr();
    uint getNumHits(const string &targetId) const;
    static void printNumActiveHdr();
    void printNumActive() const;
    void printState() const;
    void printGrid(const string &tag, const string &targetId) const;

    void saveInhibition() { savedInhibition = inhibition; }
    void restoreInhibition() { inhibition = savedInhibition; }

    string toStr(uint iLvl = 0, const string &iStr = "   ") const;
    const string id;
    const string type;
    const uint width;
    const uint height;
    const double k;
    const double minInhibition;
    const double maxInhibition;
    const double initInhibition;
    const double inhibIncr;
    double inhibition;
    double savedInhibition;
    bool isClamped;
    bool isFrozen;
    bool isLesioned;
    vector<NsUnit *> units;
    bool orthogonalPatterns;
    uint nextPatternUnit;
    unordered_map<string, NsPattern> definedPatterns;
    vector<string> definedPatternIds;
    bool printPatterns;
};

#endif