/*
 * (C) Copyright 1996- ECMWF.
 *
 * This software is licensed under the terms of the Apache Licence Version 2.0
 * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
 * In applying this licence, ECMWF does not waive the privileges and immunities
 * granted to it by virtue of its status as an intergovernmental organisation nor
 * does it submit to any jurisdiction.
 */

/// @author Baudouin Raoult
/// @author Tiago Quintino
/// @date   May 96

#ifndef eckit_config_ResourceMgr_H
#define eckit_config_ResourceMgr_H

#include <string>
#include <map>

#include "eckit/memory/NonCopyable.h"
#include "eckit/thread/Mutex.h"

namespace eckit {

class LocalPathName;


//----------------------------------------------------------------------------------------------------------------------

// A resource specifier

class ResourceQualifier {

    std::string kind_;  // Kind,  e.g. "Application"
    std::string owner_; // Owner, e.g. "mars"
    std::string name_;  // Name,  e.g. "debug"

public:

    ResourceQualifier();
    ResourceQualifier(const std::string&, const std::string&, const std::string&);

    ResourceQualifier(const ResourceQualifier&);
    ResourceQualifier& operator=(const ResourceQualifier&);

    int operator<(const ResourceQualifier&) const;

};

//----------------------------------------------------------------------------------------------------------------------


class ResourceMgr : private eckit::NonCopyable {

public: // class methods

    static ResourceMgr& instance();

    static bool lookUp(const std::string&, const std::string&, const std::string&, std::string&);

    bool registCmdArgOptions(const std::string&);

private:

    static void init();

    ResourceMgr();

    bool lookUp_(const std::string&, const std::string&, const std::string&, std::string&);

    // Only for my friends
    // You should never call these, resources have a read-only semantics
    void reset();
    void set(const std::string&, const std::string&);

    friend class ConfigCmd;
    friend class ResourceBase;

private: // methods

    void readConfigFile(const LocalPathName&);
    bool parse(const char*);

private: // members

    typedef std::map<ResourceQualifier, std::string> ResMap;

    ResMap resmap_;

    std::map<std::string, std::string> resoptions_;

    bool inited_;
};

//----------------------------------------------------------------------------------------------------------------------


} // namespace eckit

#endif
