# -*- coding: cp1252 -*-
from UserDict import UserDict
from types import DictType
import time
import datetime

class clsMaker(UserDict):

    #Direc. donde coloca las clases generadas
    __DIR__='./clases/'

    #flagConstructor indica cual de los 2 constructores usar, uno con todos
    #los parámetros o uno sin parámetros .- (Por defecto usa el con todos)

    #preambulo es cualquier cosa que se desea colocar antes de la definicion de la clase, tal com algun include raro etc...
    def __init__(self, campos, clase, clasePadre='', dirPadre='./', flagConstructor=True, preambulo=''):
        UserDict.__init__(self)
        #Para colocar la fecha actual en la descripcion
        t = datetime.datetime.now()
        a=datetime.datetime.fromtimestamp(time.mktime(t.timetuple()))
        self.__doc__=a.ctime()
        #fecha colocada
        self['clase']=clase
        self['padre']=clasePadre
#        self['top']=''
        self['dirPadre']=dirPadre;
        self['preambulo']=preambulo;        
        self.flagConstructor=flagConstructor
        self.campos=campos
        m=[]
        m.append(self.classConstructor())
        self.metodos=m
        self.metodos_g=[]
        self.metodos_u=[]
        self.metodos_rg=[]
        self.metodos_ru=[]
        self.file=self.__DIR__+self['clase']+".class.php"
        self.file_gen=self.__DIR__+"genera_"+self['clase']+".php"
        self.file_upd=self.__DIR__+"modifica_"+self['clase']+".php"
        self.file_rgen=self.__DIR__+"recibe_genera_"+self['clase']+".php"
        self.file_rupd=self.__DIR__+"recibe_modifica_"+self['clase']+".php"
    def classConstructor(self):
        if not self.flagConstructor:
            cont='\n\tfunction '+self['clase']+'(){}\n'
        else:
            cont='\n\tfunction '+self['clase']+'('
            paramsAsig=''
            for atr in self.campos:
                cont+='$'+atr+'=""'
                paramsAsig+="\t\t$this->"+atr+" = $"+atr+";\n"
                if atr!=self.campos[len(self.campos)-1]:
                    cont+=', '
            cont+='){\n' 
            cont+=paramsAsig #Agrega las asignaciones ya realizadas
            cont+='\t}\n'
        return cont

    def getStrCampos(self, desde=0):
        cont=''
        for atr in self.campos[desde:]:
                cont+=atr
                if atr!=self.campos[len(self.campos)-1]:
                    cont+=', '
        return cont

    def classTop(self):
        top='<?php\n'+' // Author   : Hector Hidalgo Sepúlveda \n // Contacto : hhidalgo@gmail.com \n // URL      : http://hhidalgo.blogspot.com/ \n // Fecha Creación : '+self.__doc__+'\n\n'
        if self['preambulo']!='':
            top+='\n//Preambulo ***********\n'+self['preambulo']+'\n\n'
        if self['padre']!='':
                top+='\nrequire_once('+'"'+self['dirPadre']+self['padre']+'.class.php");\n'
        top+="\nclass "+self['clase']+" "
        if self['padre']!='':
                top+="extends "+self['padre']
        top+="\n{\n"
        return top

    def classFoot(self):
        return "\n}\n?>"
    
    def generaGet(self, param):
        fn="\n\tfunction get"+param[0].capitalize()+param[1:]+"(){\n"
        fn+="\t\treturn $this->"+param+";"
        fn+="\n\t}\n"
        return fn
        
    def generaSet(self, param):
        fn="\n\tfunction set"+param[0].capitalize()+param[1:]+"($"+param+"){\n"
        fn+="\t\t$this->"+param+" = $"+param+";"
        fn+="\n\t}\n"
        return fn                
    
    def generaGetSet(self):
        m=self.metodos
        for x in self.campos:
            m.append(self.generaSet(x))
            m.append(self.generaGet(x))
        self.metodos=m

    def generaSave(self):
        fn='\n\tfunction save(){\n'
        fn+='\t\t$sql="INSERT INTO '+self['clase'][:1].lower()+self['clase'][1:-2]+' "\n'
        #asume que cuando posee un campo 'id', este es autoincremental .-
        desde=0
        if self.campos[0][:2]=='id':
            fn+='\t\t\t."('+self.getStrCampos(1)+')"\n'
            desde=1
        else:
            fn+='\t\t\t."('+self.getStrCampos()+')"\n'
        fn+='\t\t\t." VALUES ("\n'
        for x in self.campos[desde:]:
            fn+='\t\t\t ."'+"'"+'".$this->'+x+'."'+"'"
            if x!=self.campos[len(self.campos)-1]:
                fn+=', "\n'
            else:
                fn+=')";\n'
        fn+='\t\tif(!$this->insertbd($sql))\n'
        fn+='\t\t\treturn false;\n'
        fn+='\t\treturn true;\n'        
        fn+='\t}\n'
        self.metodos.append(fn)
        
    def generaDelete(self):
        fn='\n\tfunction delete(){\n'
        fn+='\t\t$sql="DELETE FROM '+self['clase'][:1].lower()+self['clase'][1:-2]+' "\n'
        fn+='\t\t\t." WHERE '+self.campos[0]+' ='+"'"+'".$this->'+self.campos[0]+'."'+"'"+'";\n'
        fn+='\t\treturn $this->deletebd($sql);\n'
        fn+='\t}\n'
        self.metodos.append(fn)

    def generaGetClass(self):
        fn='\n\tfunction get'+self['clase'][:1].lower()+self['clase'][1:-2]+'s($sql="",$class=""){\n'
        fn+='\t\t$'+self['clase'][:1].lower()+self['clase'][1:-2]+'s=array();\n'
        fn+='\t\t$this->connectClass();\n'
        fn+='\t\t$index = $this->query($sql);\n'
        fn+='\t\twhile($row = $this->fetch($index)){\n'
        fn+='\t\t\t$i=0;\n'
        fn+='\t\t\t$'+self['clase'][:1].lower()+'= new '+self['clase'][0:-2]+'('
        fn+='$row[$i++]'
        i = 1
        for x in self.campos[1:]:
            fn+=',$row[$i++]'
            i=i+1
        fn+=');\n'
        fn+='\t\t\tif($class == "")\n'
        fn+='\t\t\t\t$'+self['clase'][:1].lower()+self['clase'][1:-2]+'s [] = $'+self['clase'][:1].lower()+';\n'
        fn+='\t\t\telse\n'
        fn+='\t\t\t\t$'+self['clase'][:1].lower()+self['clase'][1:-2]+'s [] = (array)$'+self['clase'][:1].lower()+';\n'
        fn+='\t\t}\n'
        fn+='\t\t$this->close();\n'
        fn+='\t\treturn $'+self['clase'][:1].lower()+self['clase'][1:-2]+'s;\n'
        fn+='\t}\n'
        self.metodos.append(fn)
        
    def generaUpdate(self):
        fn='\n\tfunction update(){\n'
        fn+='\t\t$sql="UPDATE '+self['clase'][:1].lower()+self['clase'][1:-2]+' SET "\n'
        fn+='\t\t\t."'
        i=0
        for x in self.campos[1:]:
            fn+=x+"= '"+'".$this->'+x
            if x!=self.campos[len(self.campos)-1]:
                fn+='."'+"',"
            else:
                fn+='."'+"'"+'"\n'                
            i+=1
        fn+='\t\t\t." WHERE '+self.campos[0]+' ='+"'"+'".$this->'+self.campos[0]+'."'+"'"+'";\n'
        fn+='\t\treturn $this->updatebd($sql);\n'        
        fn+='\t}'
        self.metodos.append(fn)
        
    def writeClass(self):
        f=open(self.file,'w')
        f.write(self.classTop())
        if self.flagConstructor:
            self.generaGetSet()
        else:
            self.generaSave()
            self.generaDelete()
            self.generaUpdate()
            self.generaGetClass()
        for x in self.metodos:
            f.write(x)
        f.write(self.classFoot())
        f.close()


    #DESDE AQUI PARA GENERAR LAS TABLAS AUTOMAGICA MENTE.
    def tableTop(self):
        fn='<form action="recibe_'+self['clase']+'.php" method="post" name = "forma">\n'
        fn+='<table border="0" cellpading="0" cellspacing="0" align = "center" class="tabla_form">\n'
        return fn

    def tableFoot(self):
        fn='</table>\n'
        fn+='</form>'
        return fn

    def getBotones(self):
        fn='\t<tr>\n\t\t<td>'
        fn+='<input type="reset" value="Restablecer"></td>\n\t\t<td></td>\n\t\t'
        fn+='<td><input type="submit" value="Enviar"></td>\n\t</tr>\n'
        return fn
        
    def generaGenOBj(self):
        fn=''
        for x in self.campos[0:]:
            fn+='\t<tr>\n\t\t<td>'
            fn+=''+x[0].capitalize()+x[1:]+'</td>\n\t\t<td>:</td>\n\t\t<td>'
            fn+='<input type="text" name="'+x+'" id="'+x+'"></td>\n'
            fn+='\t<tr>\n'
        fn+=self.getBotones()    
        self.metodos_g.append(fn)

    def generaUpdObj(self):
        fn = '<?php \n$'+self['clase'][0].lower()+' = new '+self['clase']+'();\n'
        fn += '$'+self['clase'][0].lower()+' = $'+self['clase'][0].lower()+'->get'+self['clase']+'s(returnGlobal("id_'+self['clase'].lower()+'","GET"));\n?>'
        for x in self.campos[0:]:
            fn+='\t<tr>\n\t\t<td>'
            fn+=''+x[0].capitalize()+x[1:]+'</td>\n\t\t<td>:</td>\n\t\t<td>'
            fn+='<input type="text" name="'+x+'" id="'+x+'" value="<?php echo $'+self['clase'][0].lower()+'->get'+x[0].capitalize()+x[1:]+'();?>"></td>\n'
            fn+='\t<tr>\n'
        fn+=self.getBotones()
        self.metodos_u.append(fn)
    
    def writeTables(self):
        f_g=open(self.file_gen,'w')
        f_u=open(self.file_upd,'w')
        f_g.write(self.tableTop())
        f_u.write(self.tableTop())

        self.generaGenOBj()
        self.generaUpdObj()

        for x in self.metodos_g:
            f_g.write(x)
        for x in self.metodos_u:
            f_u.write(x)
            
        f_g.write(self.tableFoot())
        f_u.write(self.tableFoot())

        f_g.close()
        f_u.close()

    #Para los archivos que reciben los parametros por post.
    def fileRecTop(self):
        fn = '<?php\n'
        fn += 'global $PATH;\n'
        fn += '$PATH ="../";\n'
        fn += 'include($PATH."include/header.php");\n'
        
        return fn

    def fileRecFoot(self):
        fn = '?>'
        return fn
    
    def generaRecibeParams(self):
        fn='\t$'+self['clase'][0].lower()+'= new '+self['clase']+'();\n'
        for x in self.campos:
            fn+='\t$'+self['clase'][0].lower()+'->set'+x[0].capitalize()+x[1:].lower()+'(returnGlobal("'+x.lower()+'","POST"));\n'
        self.metodos_rg.append(fn)
        self.metodos_ru.append(fn)

    def generaUpdateF(self):
        fn='if($'+self['clase'][0].lower()+'->update()){\n'
        fn+='\t$msg ="Se ha actualizado correctamente la informacion en '+self['clase']+'";\n'
        fn+='}else{\n'
        fn+='\t$msg ="No se ha podido actualizar la informacion en '+self['clase']+'";\n'
        fn+='}\n'
        self.metodos_ru.append(fn)

    def generaGenerate(self):
        fn='if($'+self['clase'][0].lower()+'->save()){\n'
        fn+='\t$msg ="Se ha guardado correctamente la informacion en '+self['clase']+'";\n'
        fn+='}else{\n'
        fn+='\t$msg ="No se ha podido Guardar la informacion en '+self['clase']+'";\n'
        fn+='}\n'
        self.metodos_rg.append(fn)

    def generaMsg(self):
        fn='headerFunction($PATH."mensaje.php?msg=$msg&link=".$_SERVER[\'HTTP_REFERER\']."");\n'
        self.metodos_rg.append(fn)
        self.metodos_ru.append(fn)        
        
    def writeRecibes(self):
        f_rg = open(self.file_rgen,'w')
        f_ru = open(self.file_rupd,'w')
        f_rg.write(self.fileRecTop())
        f_ru.write(self.fileRecTop())

        self.generaRecibeParams()
        self.generaUpdateF()
        self.generaGenerate()
        self.generaMsg()
        for x in self.metodos_rg:
            f_rg.write(x)
        for x in self.metodos_ru:
            f_ru.write(x)
        f_rg.write(self.fileRecFoot())
        f_ru.write(self.fileRecFoot())
        f_ru.close()
        f_rg.close()
        
tablas={
        'usuarios'		:('usuario', 'password', 'nombres', 'apellido_pat', 'apellido_mat')
}

preambulo=''
dirPadre='".$PATH."includes/clases/"."'

for tbl in tablas:
    lstCmp=tablas[tbl]
    tabla=tbl.capitalize()
    tablaBD=tabla+'BD'
    clBD=clsMaker(lstCmp, tablaBD, 'BaseDatos', dirPadre, False,preambulo)
    cl=clsMaker(lstCmp, tabla, tablaBD, dirPadre,True,preambulo)
    clBD.writeClass()
    cl.writeClass()
    cl.writeTables()
    cl.writeRecibes()
    
