#ifndef ATOM_GROUP_AS_MD_SUBJECT_H
#define ATOM_GROUP_AS_MD_SUBJECT_H

#ifndef MD_SUBJECT_H
#include "MD_subject.h"
#endif

#ifndef OWN_H
#include "Own.h"
#endif

namespace MM
{
class Atom_group;
class Interaction;
class Mass;

class Atom_group_as_md_subject :public MD_subject
{
    Atom_group  &   model_;
    Interaction &   interaction_;
    Own <Mass>      masses_;

public:
    Atom_group_as_md_subject (Atom_group  & model,
                              Interaction & interaction,
                              Mass        * adoptee);

    void                setup_velocities (Temperature_unit const& t){FLAW("to do");}
    virtual void        start   () {FLAW("to do");}
    virtual void        finish  () {FLAW("to do");}
    virtual void        zero_virial ()                              {FLAW("to do");}
    virtual void        list   (Hint hint, double skin)             {FLAW("to do");}
    virtual void        list   (Hint hint, double R, double skin)   {FLAW("to do");}
    virtual double      degrees_of_freedom ()                       {FLAW("to do");}
    virtual double      H ()                                        {FLAW("to do");}
    virtual double      K ()                                        {FLAW("to do");}
    virtual double      U ()                                        {FLAW("to do");}
    virtual void        F      (Hint hint);
    virtual void        F      (Hint hint, double R, double Switching)  {FLAW("to do");}
    virtual void        clear_moment (Hint hint)                    {FLAW("to do");}
    virtual void        kick   (double dT, Hint hint);
    virtual void        kick   (int substeps, double dT, Hint hint) {FLAW("to do");}
    virtual void        drift  (double dT);
    virtual void        keep_configuration ()                       {FLAW("to do");}
    virtual void        restore_configuration ()                    {FLAW("to do");}
    virtual void        update (bool force = false);
    virtual bool        locked () const     {return true;           FLAW("to do");}
    virtual void        set_lock (bool on)                          {FLAW("to do");}

private:
    void                update_interactions (Hint hint);
};

}//MM

#endif //ATOM_GROUP_AS_MD_SUBJECT_H
