import Analisis_Ascendente.Instrucciones.PLPGSQL.EjecutarFuncion as EjecutarFuncion
from Analisis_Ascendente.Instrucciones.PLPGSQL.plasignacion import Plasignacion
from Analisis_Ascendente.Instrucciones.instruccion import Instruccion
from Analisis_Ascendente.Instrucciones.Create.createTable import CreateTable
from Analisis_Ascendente.Instrucciones.Create.createDatabase import CreateReplace
from Analisis_Ascendente.Instrucciones.Select.select import Select
from Analisis_Ascendente.Instrucciones.Use_Data_Base.useDB import Use
from Analisis_Ascendente.Instrucciones.Select.select1 import selectTime
import Analisis_Ascendente.Instrucciones.Insert.insert as insert_import
from Analisis_Ascendente.Instrucciones.Select.Select2 import Selectp3
from Analisis_Ascendente.Instrucciones.Select import selectInst
from Analisis_Ascendente.Instrucciones.Expresiones.Expresion import Expresion
from Analisis_Ascendente.Instrucciones.Drop.drop import Drop
from Analisis_Ascendente.Instrucciones.Alter.alterDatabase import AlterDatabase
from Analisis_Ascendente.Instrucciones.Alter.alterTable import AlterTable
from Analisis_Ascendente.Instrucciones.Update.Update import Update
from Analisis_Ascendente.Instrucciones.Delete.delete import Delete
from Analisis_Ascendente.Instrucciones.Select import SelectDist
from Analisis_Ascendente.Instrucciones.Type.type import CreateType

#----------------------------------Imports FASE2--------------------------
from Analisis_Ascendente.Instrucciones.Index.Index import Index
from Analisis_Ascendente.Instrucciones.PLPGSQL.createFunction import CreateFunction
from Analisis_Ascendente.Instrucciones.Index.DropIndex import DropIndex
from Analisis_Ascendente.Instrucciones.Index.AlterIndex import AlterIndex
from Analisis_Ascendente.Instrucciones.PLPGSQL.DropProcedure import DropProcedure
from Analisis_Ascendente.Instrucciones.PLPGSQL.CreateProcedure import CreateProcedure
from Analisis_Ascendente.Instrucciones.PLPGSQL.CasePL import CasePL
from Analisis_Ascendente.Instrucciones.PLPGSQL.plCall import plCall
from Analisis_Ascendente.Instrucciones.PLPGSQL.dropFunction import DropFunction

import C3D.GeneradorEtiquetas as GeneradorEtiquetas
import C3D.GeneradorTemporales as GeneradorTemporales
import Analisis_Ascendente.reportes.Reportes as Reportes

class Ifpl(Instruccion):
    ''' #1 If
        #2 If elif else
        #3 If else '''

    def __init__(self, caso,e_if,s_if,elif_s,s_else, fila, columna):
        self.caso = caso
        self.e_if = e_if
        self.s_if = s_if
        self.elif_s = elif_s
        self.s_else = s_else
        self.fila = fila
        self.columna = columna

    def ejecutar(self,tsglobal,ts, consola, exceptions):
        try:
            if self.caso == 1:
                resultado = Expresion.Resolver(self.e_if, ts, consola, exceptions)
                if resultado == True:
                    for x in range(0, len(self.s_if)):
                        self.procesar_instrucciones(self.s_if[x],ts,consola,exceptions,tsglobal)
                else:
                    pass
            elif self.caso == 2:
                print('hola')
            else:
                resultado = Expresion.Resolver(self.e_if, ts, consola, exceptions)
                if resultado == True:
                    for x in range(0, len(self.s_if)):
                        self.procesar_instrucciones(self.s_if[x], ts, consola, exceptions,tsglobal)
                else:
                    for x in range(0, len(self.s_else)):
                        self.procesar_instrucciones(self.s_else[x],ts,consola,exceptions,tsglobal)

        except:
            consola.append("XX000 : internal_error")


    def procesar_instrucciones(self,instr,ts,consola,exceptions,tsglobal):
        if isinstance(instr, CreateReplace):
            CreateReplace.ejecutar(instr, ts, consola, exceptions)
        elif isinstance(instr, Select):
            if instr.caso == 1:
                consola.append('caso 1')
                selectTime.ejecutar(instr, ts, consola, exceptions, True)
            elif instr.caso == 2:
                consola.append('caso 2')
                variable = SelectDist.Select_Dist()
                SelectDist.Select_Dist.ejecutar(variable, instr, ts, consola, exceptions)
            elif instr.caso == 3:
                consola.append('caso 3')
                variable = selectInst.Select_inst()
                selectInst.Select_inst.ejecutar(variable, instr, ts, consola, exceptions)
            elif instr.caso == 4:
                consola.append('caso 4')
                Selectp3.ejecutar(instr, ts, consola, exceptions, True)
            elif instr.caso == 6:
                consola.append('caso 6')
        elif isinstance(instr, CreateTable):
            CreateTable.ejecutar(instr, ts, consola, exceptions)
        elif isinstance(instr, Use):
            Use.ejecutar(instr, ts, consola, exceptions)
        elif isinstance(instr, insert_import.InsertInto):
            insert_import.InsertInto.ejecutar(instr, ts, consola, exceptions)
            # print("Ejecute un insert")
        elif isinstance(instr, Drop):
            Drop.ejecutar(instr, ts, consola, exceptions)
            # print("Ejecute drop")
        elif isinstance(instr, AlterDatabase):
            AlterDatabase.ejecutar(instr, ts, consola, exceptions)
            # print("Ejecute alter database")
        elif isinstance(instr, AlterTable):
            AlterTable.ejecutar(instr, ts, consola, exceptions)
            # print("Ejecute alter table")
        elif isinstance(instr, Delete):
            Delete.ejecutar(instr, ts, consola, exceptions)
            # print("Ejecute delete")
        elif isinstance(instr, Update):
            Update.ejecutar(instr, ts, consola, exceptions)
        elif isinstance(instr, CreateType):
            CreateType.ejecutar(instr, ts, consola, exceptions)
        elif isinstance(instr, Index):
            Index.ejecutar(instr, ts, consola, exceptions)
            # print("Ejecute Index")
        elif isinstance(instr, CreateFunction):
            CreateFunction.ejecutar(instr, ts, consola, exceptions)
        elif isinstance(instr, DropFunction):
            DropFunction.ejecutar(instr, ts, consola, exceptions)
        elif isinstance(instr, DropIndex):
            DropIndex.ejecutar(instr, ts, consola, exceptions)
        elif isinstance(instr, AlterIndex):
            AlterIndex.ejecutar(instr, ts, consola, exceptions)
        elif isinstance(instr, DropProcedure):
            DropProcedure.ejecutar(instr, ts, consola, exceptions)
        elif isinstance(instr, CreateProcedure):
            CreateProcedure.ejecutar(instr, ts, consola, exceptions)
        elif isinstance(instr, CasePL):
            CasePL.ejecutar(instr, ts, consola, exceptions)
        elif isinstance(instr, plCall):
            plCall.ejecutar(instr, ts, consola, exceptions)
        elif isinstance(instr, Plasignacion):
            EjecutarFuncion.ejecutarPlasignacionIf(instr,ts,consola,exceptions,tsglobal)
        elif isinstance(instr, Ifpl):
            instr.ejecutar(tsglobal,ts,consola,exceptions)
        else:
            return

    def getC3D(self, lista_optimizaciones_C3D):
        etiqueta_if = GeneradorEtiquetas.nueva_etiqueta()
        etiqueta_else = GeneradorEtiquetas.nueva_etiqueta()
        etiqueta_salida = GeneradorEtiquetas.nueva_etiqueta()
        e_if = self.e_if.getC3D(lista_optimizaciones_C3D)
        noOptimizado = '''if %s: goto .%s <br>
goto .%s<br>
label .%s<br>
&lt;instrucciones&gt;<br>
label .%s''' % (e_if['tmp'], etiqueta_if, etiqueta_else, etiqueta_if, etiqueta_else)
        optimizado = '''if not %s: goto .%s <br>
&lt;instrucciones&gt;<br>
label .%s''' % (e_if['tmp'], etiqueta_else, etiqueta_else)
        optimizacion1 = Reportes.ListaOptimizacion(noOptimizado, optimizado, Reportes.TipoOptimizacion.REGLA3)
        lista_optimizaciones_C3D.append(optimizacion1)

        sentencias_if = ''
        for sentencias in self.s_if:
            sentencias_if += sentencias.getC3D(lista_optimizaciones_C3D)
        c3d = '''
%s
    if not %s: goto .%s
%s
    goto .%s
''' % (e_if['code'], e_if['tmp'], etiqueta_else, sentencias_if, etiqueta_salida)

        if self.s_else is not None:
            sentencias_else = ''
            for sentencias in self.s_else:
                sentencias_else += sentencias.getC3D(lista_optimizaciones_C3D)
            c3d += '''    label .%s
%s
    label .%s''' % (etiqueta_else, sentencias_else, etiqueta_salida)
        else:
            c3d += '''    label .%s
    label .%s
''' % (etiqueta_else, etiqueta_salida)
        return c3d

    def get_quemado(self):
        sententias_if = ''
        for sentencia in self.s_if:
            sententias_if += sentencia.get_quemado() + ';\n'
        quemado = '''   if %s then
%s
''' % (self.e_if.get_quemado(), sententias_if)
        if self.s_else is not None:
            sentencias_else = ''
            for sentencia in self.s_else:
                sentencias_else += sentencia.get_quemado() + ';\n'
            quemado += '''ELSE
%s
''' % sentencias_else
        quemado += '    end if'
        return quemado

[((144, 22, 144, 57), 'C3D.GeneradorEtiquetas.nueva_etiqueta', 'GeneradorEtiquetas.nueva_etiqueta', ({}, {}), '()', True, 'import C3D.GeneradorEtiquetas as GeneradorEtiquetas\n'), ((145, 24, 145, 59), 'C3D.GeneradorEtiquetas.nueva_etiqueta', 'GeneradorEtiquetas.nueva_etiqueta', ({}, {}), '()', True, 'import C3D.GeneradorEtiquetas as GeneradorEtiquetas\n'), ((146, 26, 146, 61), 'C3D.GeneradorEtiquetas.nueva_etiqueta', 'GeneradorEtiquetas.nueva_etiqueta', ({}, {}), '()', True, 'import C3D.GeneradorEtiquetas as GeneradorEtiquetas\n'), ((156, 24, 156, 110), 'Analisis_Ascendente.reportes.Reportes.ListaOptimizacion', 'Reportes.ListaOptimizacion', ({(156, 51, 156, 63): 'noOptimizado', (156, 65, 156, 75): 'optimizado', (156, 77, 156, 109): 'Reportes.TipoOptimizacion.REGLA3'}, {}), '(noOptimizado, optimizado, Reportes.\n    TipoOptimizacion.REGLA3)', True, 'import Analisis_Ascendente.reportes.Reportes as Reportes\n'), ((76, 12, 76, 66), 'Analisis_Ascendente.Instrucciones.Create.createDatabase.CreateReplace.ejecutar', 'CreateReplace.ejecutar', ({(76, 35, 76, 40): 'instr', (76, 42, 76, 44): 'ts', (76, 46, 76, 53): 'consola', (76, 55, 76, 65): 'exceptions'}, {}), '(instr, ts, consola, exceptions)', False, 'from Analisis_Ascendente.Instrucciones.Create.createDatabase import CreateReplace\n'), ((53, 28, 53, 82), 'Analisis_Ascendente.Instrucciones.Expresiones.Expresion.Expresion.Resolver', 'Expresion.Resolver', ({(53, 47, 53, 56): 'self.e_if', (53, 58, 53, 60): 'ts', (53, 62, 53, 69): 'consola', (53, 71, 53, 81): 'exceptions'}, {}), '(self.e_if, ts, consola, exceptions)', False, 'from Analisis_Ascendente.Instrucciones.Expresiones.Expresion import Expresion\n'), ((62, 28, 62, 82), 'Analisis_Ascendente.Instrucciones.Expresiones.Expresion.Expresion.Resolver', 'Expresion.Resolver', ({(62, 47, 62, 56): 'self.e_if', (62, 58, 62, 60): 'ts', (62, 62, 62, 69): 'consola', (62, 71, 62, 81): 'exceptions'}, {}), '(self.e_if, ts, consola, exceptions)', False, 'from Analisis_Ascendente.Instrucciones.Expresiones.Expresion import Expresion\n'), ((80, 16, 80, 73), 'Analisis_Ascendente.Instrucciones.Select.select1.selectTime.ejecutar', 'selectTime.ejecutar', ({(80, 36, 80, 41): 'instr', (80, 43, 80, 45): 'ts', (80, 47, 80, 54): 'consola', (80, 56, 80, 66): 'exceptions', (80, 68, 80, 72): '(True)'}, {}), '(instr, ts, consola, exceptions, True)', False, 'from Analisis_Ascendente.Instrucciones.Select.select1 import selectTime\n'), ((95, 12, 95, 64), 'Analisis_Ascendente.Instrucciones.Create.createTable.CreateTable.ejecutar', 'CreateTable.ejecutar', ({(95, 33, 95, 38): 'instr', (95, 40, 95, 42): 'ts', (95, 44, 95, 51): 'consola', (95, 53, 95, 63): 'exceptions'}, {}), '(instr, ts, consola, exceptions)', False, 'from Analisis_Ascendente.Instrucciones.Create.createTable import CreateTable\n'), ((83, 27, 83, 51), 'Analisis_Ascendente.Instrucciones.Select.SelectDist.Select_Dist', 'SelectDist.Select_Dist', ({}, {}), '()', False, 'from Analisis_Ascendente.Instrucciones.Select import SelectDist\n'), ((84, 16, 84, 89), 'Analisis_Ascendente.Instrucciones.Select.SelectDist.Select_Dist.ejecutar', 'SelectDist.Select_Dist.ejecutar', ({(84, 48, 84, 56): 'variable', (84, 58, 84, 63): 'instr', (84, 65, 84, 67): 'ts', (84, 69, 84, 76): 'consola', (84, 78, 84, 88): 'exceptions'}, {}), '(variable, instr, ts, consola, exceptions)', False, 'from Analisis_Ascendente.Instrucciones.Select import SelectDist\n'), ((97, 12, 97, 56), 'Analisis_Ascendente.Instrucciones.Use_Data_Base.useDB.Use.ejecutar', 'Use.ejecutar', ({(97, 25, 97, 30): 'instr', (97, 32, 97, 34): 'ts', (97, 36, 97, 43): 'consola', (97, 45, 97, 55): 'exceptions'}, {}), '(instr, ts, consola, exceptions)', False, 'from Analisis_Ascendente.Instrucciones.Use_Data_Base.useDB import Use\n'), ((87, 27, 87, 51), 'Analisis_Ascendente.Instrucciones.Select.selectInst.Select_inst', 'selectInst.Select_inst', ({}, {}), '()', False, 'from Analisis_Ascendente.Instrucciones.Select import selectInst\n'), ((88, 16, 88, 89), 'Analisis_Ascendente.Instrucciones.Select.selectInst.Select_inst.ejecutar', 'selectInst.Select_inst.ejecutar', ({(88, 48, 88, 56): 'variable', (88, 58, 88, 63): 'instr', (88, 65, 88, 67): 'ts', (88, 69, 88, 76): 'consola', (88, 78, 88, 88): 'exceptions'}, {}), '(variable, instr, ts, consola, exceptions)', False, 'from Analisis_Ascendente.Instrucciones.Select import selectInst\n'), ((99, 12, 99, 77), 'Analisis_Ascendente.Instrucciones.Insert.insert.InsertInto.ejecutar', 'insert_import.InsertInto.ejecutar', ({(99, 46, 99, 51): 'instr', (99, 53, 99, 55): 'ts', (99, 57, 99, 64): 'consola', (99, 66, 99, 76): 'exceptions'}, {}), '(instr, ts, consola, exceptions)', True, 'import Analisis_Ascendente.Instrucciones.Insert.insert as insert_import\n'), ((91, 16, 91, 71), 'Analisis_Ascendente.Instrucciones.Select.Select2.Selectp3.ejecutar', 'Selectp3.ejecutar', ({(91, 34, 91, 39): 'instr', (91, 41, 91, 43): 'ts', (91, 45, 91, 52): 'consola', (91, 54, 91, 64): 'exceptions', (91, 66, 91, 70): '(True)'}, {}), '(instr, ts, consola, exceptions, True)', False, 'from Analisis_Ascendente.Instrucciones.Select.Select2 import Selectp3\n'), ((102, 12, 102, 57), 'Analisis_Ascendente.Instrucciones.Drop.drop.Drop.ejecutar', 'Drop.ejecutar', ({(102, 26, 102, 31): 'instr', (102, 33, 102, 35): 'ts', (102, 37, 102, 44): 'consola', (102, 46, 102, 56): 'exceptions'}, {}), '(instr, ts, consola, exceptions)', False, 'from Analisis_Ascendente.Instrucciones.Drop.drop import Drop\n'), ((105, 12, 105, 66), 'Analisis_Ascendente.Instrucciones.Alter.alterDatabase.AlterDatabase.ejecutar', 'AlterDatabase.ejecutar', ({(105, 35, 105, 40): 'instr', (105, 42, 105, 44): 'ts', (105, 46, 105, 53): 'consola', (105, 55, 105, 65): 'exceptions'}, {}), '(instr, ts, consola, exceptions)', False, 'from Analisis_Ascendente.Instrucciones.Alter.alterDatabase import AlterDatabase\n'), ((108, 12, 108, 63), 'Analisis_Ascendente.Instrucciones.Alter.alterTable.AlterTable.ejecutar', 'AlterTable.ejecutar', ({(108, 32, 108, 37): 'instr', (108, 39, 108, 41): 'ts', (108, 43, 108, 50): 'consola', (108, 52, 108, 62): 'exceptions'}, {}), '(instr, ts, consola, exceptions)', False, 'from Analisis_Ascendente.Instrucciones.Alter.alterTable import AlterTable\n'), ((111, 12, 111, 59), 'Analisis_Ascendente.Instrucciones.Delete.delete.Delete.ejecutar', 'Delete.ejecutar', ({(111, 28, 111, 33): 'instr', (111, 35, 111, 37): 'ts', (111, 39, 111, 46): 'consola', (111, 48, 111, 58): 'exceptions'}, {}), '(instr, ts, consola, exceptions)', False, 'from Analisis_Ascendente.Instrucciones.Delete.delete import Delete\n'), ((114, 12, 114, 59), 'Analisis_Ascendente.Instrucciones.Update.Update.Update.ejecutar', 'Update.ejecutar', ({(114, 28, 114, 33): 'instr', (114, 35, 114, 37): 'ts', (114, 39, 114, 46): 'consola', (114, 48, 114, 58): 'exceptions'}, {}), '(instr, ts, consola, exceptions)', False, 'from Analisis_Ascendente.Instrucciones.Update.Update import Update\n'), ((116, 12, 116, 63), 'Analisis_Ascendente.Instrucciones.Type.type.CreateType.ejecutar', 'CreateType.ejecutar', ({(116, 32, 116, 37): 'instr', (116, 39, 116, 41): 'ts', (116, 43, 116, 50): 'consola', (116, 52, 116, 62): 'exceptions'}, {}), '(instr, ts, consola, exceptions)', False, 'from Analisis_Ascendente.Instrucciones.Type.type import CreateType\n'), ((118, 12, 118, 58), 'Analisis_Ascendente.Instrucciones.Index.Index.Index.ejecutar', 'Index.ejecutar', ({(118, 27, 118, 32): 'instr', (118, 34, 118, 36): 'ts', (118, 38, 118, 45): 'consola', (118, 47, 118, 57): 'exceptions'}, {}), '(instr, ts, consola, exceptions)', False, 'from Analisis_Ascendente.Instrucciones.Index.Index import Index\n'), ((121, 12, 121, 67), 'Analisis_Ascendente.Instrucciones.PLPGSQL.createFunction.CreateFunction.ejecutar', 'CreateFunction.ejecutar', ({(121, 36, 121, 41): 'instr', (121, 43, 121, 45): 'ts', (121, 47, 121, 54): 'consola', (121, 56, 121, 66): 'exceptions'}, {}), '(instr, ts, consola, exceptions)', False, 'from Analisis_Ascendente.Instrucciones.PLPGSQL.createFunction import CreateFunction\n'), ((123, 12, 123, 65), 'Analisis_Ascendente.Instrucciones.PLPGSQL.dropFunction.DropFunction.ejecutar', 'DropFunction.ejecutar', ({(123, 34, 123, 39): 'instr', (123, 41, 123, 43): 'ts', (123, 45, 123, 52): 'consola', (123, 54, 123, 64): 'exceptions'}, {}), '(instr, ts, consola, exceptions)', False, 'from Analisis_Ascendente.Instrucciones.PLPGSQL.dropFunction import DropFunction\n'), ((125, 12, 125, 62), 'Analisis_Ascendente.Instrucciones.Index.DropIndex.DropIndex.ejecutar', 'DropIndex.ejecutar', ({(125, 31, 125, 36): 'instr', (125, 38, 125, 40): 'ts', (125, 42, 125, 49): 'consola', (125, 51, 125, 61): 'exceptions'}, {}), '(instr, ts, consola, exceptions)', False, 'from Analisis_Ascendente.Instrucciones.Index.DropIndex import DropIndex\n'), ((127, 12, 127, 63), 'Analisis_Ascendente.Instrucciones.Index.AlterIndex.AlterIndex.ejecutar', 'AlterIndex.ejecutar', ({(127, 32, 127, 37): 'instr', (127, 39, 127, 41): 'ts', (127, 43, 127, 50): 'consola', (127, 52, 127, 62): 'exceptions'}, {}), '(instr, ts, consola, exceptions)', False, 'from Analisis_Ascendente.Instrucciones.Index.AlterIndex import AlterIndex\n'), ((129, 12, 129, 66), 'Analisis_Ascendente.Instrucciones.PLPGSQL.DropProcedure.DropProcedure.ejecutar', 'DropProcedure.ejecutar', ({(129, 35, 129, 40): 'instr', (129, 42, 129, 44): 'ts', (129, 46, 129, 53): 'consola', (129, 55, 129, 65): 'exceptions'}, {}), '(instr, ts, consola, exceptions)', False, 'from Analisis_Ascendente.Instrucciones.PLPGSQL.DropProcedure import DropProcedure\n'), ((131, 12, 131, 68), 'Analisis_Ascendente.Instrucciones.PLPGSQL.CreateProcedure.CreateProcedure.ejecutar', 'CreateProcedure.ejecutar', ({(131, 37, 131, 42): 'instr', (131, 44, 131, 46): 'ts', (131, 48, 131, 55): 'consola', (131, 57, 131, 67): 'exceptions'}, {}), '(instr, ts, consola, exceptions)', False, 'from Analisis_Ascendente.Instrucciones.PLPGSQL.CreateProcedure import CreateProcedure\n'), ((133, 12, 133, 59), 'Analisis_Ascendente.Instrucciones.PLPGSQL.CasePL.CasePL.ejecutar', 'CasePL.ejecutar', ({(133, 28, 133, 33): 'instr', (133, 35, 133, 37): 'ts', (133, 39, 133, 46): 'consola', (133, 48, 133, 58): 'exceptions'}, {}), '(instr, ts, consola, exceptions)', False, 'from Analisis_Ascendente.Instrucciones.PLPGSQL.CasePL import CasePL\n'), ((135, 12, 135, 59), 'Analisis_Ascendente.Instrucciones.PLPGSQL.plCall.plCall.ejecutar', 'plCall.ejecutar', ({(135, 28, 135, 33): 'instr', (135, 35, 135, 37): 'ts', (135, 39, 135, 46): 'consola', (135, 48, 135, 58): 'exceptions'}, {}), '(instr, ts, consola, exceptions)', False, 'from Analisis_Ascendente.Instrucciones.PLPGSQL.plCall import plCall\n'), ((137, 12, 137, 88), 'Analisis_Ascendente.Instrucciones.PLPGSQL.EjecutarFuncion.ejecutarPlasignacionIf', 'EjecutarFuncion.ejecutarPlasignacionIf', ({(137, 51, 137, 56): 'instr', (137, 57, 137, 59): 'ts', (137, 60, 137, 67): 'consola', (137, 68, 137, 78): 'exceptions', (137, 79, 137, 87): 'tsglobal'}, {}), '(instr, ts, consola, exceptions, tsglobal\n    )', True, 'import Analisis_Ascendente.Instrucciones.PLPGSQL.EjecutarFuncion as EjecutarFuncion\n')]