#!/usr/bin/python

"""Add a class to the module passed as the first argument.
"""

import os
import sys
import getopt
import shutil

rawheader="""/**
 *  \\file ClassName.h
 *  \\brief XXXXXXXXXXXXXX
 *
 *  Copyright 2007-2010 IMP Inventors. All rights reserved.
 */

#ifndef IMPMODULENAME_CLASS_NAME_H
#define IMPMODULENAME_CLASS_NAME_H

#include "config.h"
#include <IMP/PairContainer.h>
#include <IMP/SingletonContainer.h>
#include <IMP/classtype.h>

IMPMODULENAME_BEGIN_NAMESPACE

//! XXXX
/** XXXXXX.
 */
class IMPMODULENAMEEXPORT ClassName: public classtype
{
public:
  //! XXXX
  ClassName();

  CLASSTYPE
};


IMPMODULENAME_END_NAMESPACE

#endif  /* IMPMODULENAME_CLASS_NAME_H */
"""

rawcpp="""/**
 *  \\file ClassName.cpp
 *  \\brief XXXX.
 *
 *  Copyright 2007-2010 IMP Inventors. All rights reserved.
 *
 */

#include "IMP/modulename/ClassName.h"


IMPMODULENAME_BEGIN_NAMESPACE

ClassName::ClassName( ){
}

void ClassName::show(std::ostream &out) const {
  out << "ClassName" << std::endl;
}

IMPMODULENAME_END_NAMESPACE
"""

def usage():
    print "Usage: modulename \'Class Name\' [parent_type]\n" % sys.argv[0]
    print "Add the class ClassName to module modulename inheriting from parent_type.\n"



def main():
    if len(sys.argv) != 3 and len(sys.argv) != 4:
        usage()
        exit(1)
    modulename = sys.argv[1]
    classname =sys.argv[2]
    ccclassname= classname.replace(" ", "")
    ucclassname= classname.upper().replace(" ", "_")
    ucmodname= modulename.upper()

    if len(sys.argv) >3:
        type= sys.argv[3]
        typemacro= "IMP_"+type.upper()+"("+ccclassname +", get_module_version_info())"
    else:
        type="RefCountedObject"
        typemacro="IMP_REF_COUNTED_DESTRUCTOR("+ccclassname+")"
    print "Adding "+classname+" to " + modulename
    header=rawheader.replace("ClassName", ccclassname)\
        .replace("modulename", modulename)\
        .replace("CLASS_NAME", ucclassname)\
        .replace("MODULENAME", ucmodname)\
        .replace('classtype', type).replace('CLASSTYPE', typemacro)

    cpp=rawcpp.replace("ClassName", ccclassname)\
        .replace("modulename", modulename)\
        .replace("CLASS_NAME", ucclassname)\
        .replace("MODULENAME", ucmodname).replace("modulename", modulename)
   
    open(os.path.join("modules", modulename, "include",
                      ccclassname+".h"), 'w')\
        .write(header);

    open(os.path.join("modules", modulename, "src",
                      ccclassname+".cpp"), 'w')\
        .write(cpp);

if __name__ == '__main__':
    main()
