#! python
# -*- coding: utf-8 -*-
# (c) 2006 Juergen Riegel

from . import template
import generateBase.generateModel_Module
import generateBase.generateTools


class TemplateFeature(template.ModelTemplate):
    def Generate(self):
        file = open(self.path + self.feature.Name + "Imp.cpp", "w")
        generateBase.generateTools.replace(self.TemplateImplement, locals(), file)
        file = open(self.path + self.feature.Name + ".cpp", "w")
        generateBase.generateTools.replace(self.TemplateModule, locals(), file)
        file = open(self.path + self.feature.Name + ".h", "w")
        generateBase.generateTools.replace(self.TemplateHeader, locals(), file)
        # file.write( generateBase.generateTools.replace(self.Template,locals()))

    TemplateHeader = """
#ifndef @self.module.Name.upper()@_FEATURE_@self.feature.Name.upper()@_H
#define @self.module.Name.upper()@_FEATURE_@self.feature.Name.upper()@_H

#include <App/PropertyStandard.h>

#include <App/Feature.h>

namespace @self.module.Name@
{


class @self.feature.Name@ : public App::Feature
{
  PROPERTY_HEADER(@self.module.Name@::@self.feature.Name@);

public:
  @self.feature.Name@();
+ for i in self.feature.Property:
  @i.Type@ @i.Name@;
-

  /** @name Methods override feature */
  //@{
  /// Recalculate the feature
  virtual int execute(void);
  /// Return the type name of the ViewProvider
  virtual const char* getViewProviderName(void) const {
    return "@self.module.Name@Gui::ViewProviderBox";
  }
  //@}
};

} //namespace @self.module.Name@

#endif // @self.module.Name.upper()@_FEATURE_@self.feature.Name.upper()@_H

"""
    TemplateModule = """
#include "PreCompiled.h"

#include "@self.feature.Name@.h"

using namespace @self.module.Name@;

PROPERTY_SOURCE(@self.module.Name@::@self.feature.Name@, App::Feature)

@self.feature.Name@::@self.feature.Name@()
{
+ for i in self.feature.Property:
  ADD_PROPERTY(@i.Name@,(0.0));
-
}
"""
    # Here's the template for the user part of the implementation. This does NOT get overwritten if it already exists.
    TemplateImplement = """
//
#include "PreCompiled.h"

#include "@self.feature.Name@.h"

using namespace @self.module.Name@;

// TODO This method implements the function of the feature
int @self.feature.Name@::execute(void)
{
   return 0;
}

"""
