#ifndef CXX_GRI30H
#define CXX_GRI30H

#include <string>

#include "thermo/IdealGasPhase.h"
#include "kinetics/GRI_30_Kinetics.h"
#include "kinetics/importKinetics.h"
#include "base/stringUtils.h"

namespace Cantera
{

/**
 * This class is a convenience class for use in C++ programs that
 * hard-wires the GRI 3.0 reaction mechanism. It derivees from
 * both Cantera::IdealGasPhase, which handles all composition and
 * state information, as well as thermodynamic properties, and
 * class GRI_30_Kinetics, which is the kinetics manager with
 * hard-wired replacements for some of the generic kinetics
 * methods like "getNetReactionRates."
 */
class GRI30 :
    public IdealGasPhase,
    public GRI_30_Kinetics
{
public:
    GRI30() : m_ok(false), m_r(0) {
        m_r = get_XML_File("gri30.xml");
        m_ok = buildSolutionFromXML(*m_r, "gri30",
                                    "phase", this, this);
        if (!m_ok) throw CanteraError("GRI30",
                                          "buildSolutionFromXML returned false");
    }

    virtual ~GRI30() {}

    bool operator!() {
        return !m_ok;
    }
    bool ready() const {
        return m_ok;
    }
    friend std::ostream& operator<<(std::ostream& s, GRI30& mix) {
        std::string r = mix.report(true);
        s << r;
        return s;
    }

protected:
    bool m_ok;
    Cantera::XML_Node* m_r;

private:
};
}


#endif
