# Copyright 2019-present Infosys Limited     
# SPDX-License-Identifier: Apache-2.0


import re
import os

from template import Template
from xlUtils import xlUtils,wb
templateData = {}
templateData['instList']=[]
grpIeDataTypeData={}
grpIeDataTypeData['grpList']=[]
grpIeDataTypeData['grpTypeList']=[]
class GenerateGrpIeClass():
    def __init__( self ):
        
        self.groupIEParser()
    
    def groupIEParser(self):
        
        
        sheet = wb['Grouped IE Modeling']
        state = ''
        
        data = {}
        grpIeData = {}
        currentGrpie = ''
        currentMsg = ''
        currentVar = ''
        currentInstance = ''
        currentInstanceValue = 0
        grpIeList = []
        ieDetailsList = []
        ieList = []
       
        for i in range(1,sheet.max_row+1):
            
            cell_value_B = xlUtils.getCellValue(sheet,i,'B')
            
            mGroupedIeDefStart = re.search('Grouped IE Definition Start:(\w+):(\d+):(\w+):(\w+):Instance\[(\d+)]',str(cell_value_B))
            mGroupedIeDefEnd = re.search('Grouped IE Definition End:(\w+):(\w+)',str(cell_value_B))
            
            if mGroupedIeDefStart:
                
                state = 'StartDetected'
                currentGrpie = mGroupedIeDefStart.group(1)
                currentMsg = mGroupedIeDefStart.group(4)
                currentVar = mGroupedIeDefStart.group(3)
                currentInstanceValue = mGroupedIeDefStart.group(5)
                currentInstance = currentVar + 'In' + currentMsg
                
                if currentGrpie not in grpIeList:
                     grpIeList.append(currentGrpie)
                     data['grpIeList'] = grpIeList
                data['grpIeDetails'] = {}
                data['grpIeDetails'][currentGrpie] = {}
                data['grpIeDetails'][currentGrpie]['ieTypeValue'] = mGroupedIeDefStart.group(2)
                data['grpIeDetails'][currentGrpie]['instList'] = []
                data['grpIeDetails'][currentGrpie]['instList'].append(currentInstance)
                data['grpIeDetails'][currentGrpie][currentInstance] = {}
                data['grpIeDetails'][currentGrpie][currentInstance]['instance'] = currentInstanceValue
                grpIeData = data['grpIeDetails'][currentGrpie][currentInstance]
                grpIeData['msgName'] = currentMsg
                
            elif mGroupedIeDefEnd:
                state = 'EndDetected'
                grpIeData = {} 
                ieList = []
                grpIeList=[]
                ieDetailsList = []
               
                GenerateGrpIeClass.generateGroupedIeClasses(data)
                GenerateGrpIeClass.prepareGrpIeMakeFile()
                
                
            elif state == 'StartDetected':
                state = 'IeListStart'
                
            elif state == 'IeListStart':
                
                if xlUtils.getCellValue(sheet,i,'D') != None:
                    ieData = {}
                    ieDescription = xlUtils.getCellValue(sheet,i,'D')
                    ieData['ieDescription'] = xlUtils.getCellValue(sheet,i,'D')
                    ieData['presence'] = xlUtils.getCellValue(sheet,i,'E')
                    ieData['grouped'] = xlUtils.getCellValue(sheet,i,'B')
                    ieData['cardinality'] = xlUtils.getCellValue(sheet,i,'C')
                    ieData['instance'] = xlUtils.getCellValue(sheet,i,'H') 
                    
                    if ieData['cardinality'] == None:
                        ieData['cardinality'] = 1 
                    ieTypeDescription = xlUtils.getCellValue(sheet,i,'G')
                    ieData['ieTypeDescription'] = ieTypeDescription
                    
                    ieVarName  = xlUtils.getVarNameFromString(ieDescription,0)
                    
                    ieTypeName  = xlUtils.getVarNameFromString(ieTypeDescription,1)
                    
                    if ieData['grouped'] == 'Yes':
                        ieData['ieGroupTypeName'] = ieVarName.capitalize() + 'In' + currentMsg
                        
                    ieData['ieVarName'] = ieVarName
                    ieData['ieTypeName'] = ieTypeName
                    
                    
                    ieList.append(ieVarName)
                    grpIeData['ieList'] = ieList
                    grpIeData['ieDetails'] = {}
                    grpIeData['ieDetails'][ieVarName] = ieData
                    ieDetailsList.append(grpIeData['ieDetails'])
                    grpIeData['ieDetails'] = ieDetailsList
                    
        
    def generateGroupedIeClasses(data):
        parsedData = data
        
        for grpIe in parsedData['grpIeList']:
            
            grpIeDetails = parsedData['grpIeDetails'][grpIe]
            
            GenerateGrpIeClass.generateGroupedIeClass(grpIeDetails,grpIe)
            GenerateGrpIeClass.generateGroupedIeDataType(grpIeDetails, grpIe)
    def generateGroupedIeClass(grpIeDetails,grpIe):
        
        templateData['fileName'] = grpIe[0].lower()+grpIe[1:] + 'Ie'
        templateData['className'] = grpIe + 'Ie'
        templateData['classNameUC'] = templateData['fileName'].upper()
        fileName=templateData['fileName']

        for inst in grpIeDetails['instList']:
            instanceInfo = {}
            instDetails  = grpIeDetails[inst]
            GenerateGrpIeClass.generateGroupedIeInstanceClass(instDetails, inst)
            
            instanceInfo['className'] = inst
            instanceInfo['fileName'] = inst[0].lower()+inst[1:]
            instanceInfo['msgType'] =  instDetails['msgName'] + 'MsgType'
            instanceInfo['instance'] = instDetails['instance']
            
            if instanceInfo not in templateData['instList']:
                templateData['instList'].append(instanceInfo)
            
        templateData[fileName]=[inst for inst in templateData['instList'] if grpIe in inst['className']]                
           
        outputDir = '../../src/gtpV2Codec/ieClasses'
        ttFileNameCpp = 'tts/grpietemplate.cpp.tt'
        ttFileNameH = 'tts/grpietemplate.h.tt'
        xlUtils.templateProcess(templateData,ttFileNameCpp,ttFileNameH,outputDir,outputDir)
        
        objectfile ='ieClasses/' + templateData['fileName'] + '.o'
        sourcefile = 'ieClasses/' + templateData['fileName'] + '.cpp'
        xlUtils.addToMakeSo('gtpV2Stack.so',objectfile,sourcefile)
    
    def generateGroupedIeDataType(grpIeDetails, grpIe):
        grpIeInfo={}
        
        grpIeInfo['iePresenceList']=[]
        grpIeTypeInfo={}
        grpIeTypeInfo['grpIeTypeName']=grpIe + 'IeType'
        grpIeTypeInfo['grpIeTypeValue']=grpIeDetails['ieTypeValue']
        if grpIeTypeInfo not in grpIeDataTypeData['grpTypeList']:
            grpIeDataTypeData['grpTypeList'].append(grpIeTypeInfo)
        
        for inst in grpIeDetails['instList']:
            
            instDetails  = grpIeDetails[inst]
            grpIeInfo={}
            grpIeInfo['iePresenceList']=[]
            grpIeInfo['grpIeName']= inst+'Data'
            grpIeInfo['ieList']=[]
            for ieDict in instDetails['ieDetails']:
                for ieDetails in ieDict:
                    if ieDict[ieDetails]['presence']!='M':
                        grpIeInfo['iePresenceList'].append(ieDict[ieDetails]['ieVarName']+'IePresent')
                    ieInfo={}
                    ieInfo['ieTypeName']=ieDict[ieDetails]['ieTypeName']+'IeData'
                    ieInfo['ieVarName']=ieDict[ieDetails]['ieVarName']
                    grpIeInfo['ieList'].append(ieInfo)
        
        if grpIeInfo not in grpIeDataTypeData['grpList']:
            grpIeDataTypeData['grpList'].append(grpIeInfo)
        template = Template()
        ttFileNamefactoryH = 'tts/grpIeDataTypetemplate.h.tt'
        outputDir = '../../src/gtpV2Codec/ieClasses/'
        
        if not os.path.exists(outputDir):
            os.makedirs(outputDir)
        outputFileName = 'gtpV2GrpIeDataTypes.h'
        template.__init__({'OUTPUT' : outputFileName, 'OUTPUT_PATH' : outputDir})
        template.process(ttFileNamefactoryH, {'tempdata' : grpIeDataTypeData})
        
    def generateGroupedIeInstanceClass(instDetails, inst):
        templateInstData = {}
        ieTypeList = []
        ieTypeDetailsList = []
       
        ieInfoList =[]
       
        templateInstData['fileName'] = inst[0].lower()+inst[1:]
        
        templateInstData['msgClassName'] = inst
        templateInstData['classNameUC'] = templateInstData['fileName'].upper()
        
        for ieEntry in instDetails['ieList']:
            
            ieInfo = {}
            ieTypeInfo = {}
            
            ies = instDetails['ieDetails']
            for x in ies:
                
                ie = x.get(ieEntry)
                
                if ie != None and ieEntry == ie.get('ieVarName'):
                    ieInfo['ieName'] =  ie['ieVarName']
                    ieInfo['ieVarName'] = ie['ieVarName']
                    ieInfo['ieType'] = ie['ieTypeName']
                    ieInfo['ieFileName'] = ie['ieTypeName'][0].lower()+ie['ieTypeName'][1:] + 'Ie'
                    ieInfo['ieLocalVar'] = ie['ieTypeName'][0].lower()+ie['ieTypeName'][1:]
                    ieInfo['iePresence'] = ie['presence']
                    ieInfo['ieCardinality'] = ie['cardinality']
                    ieInfo['instance'] = ie['instance']
                    ieInfo['grouped'] = ie['grouped']
                   
                    ieType = ieInfo['ieType']
                    
                    ieTypeInfo['ieName'] =  ie['ieVarName']
                    ieTypeInfo['ieVarName'] = ie['ieVarName']
                    ieTypeInfo['ieType'] = ie['ieTypeName']
                    ieTypeInfo['ieFileName'] = ie['ieTypeName'][0].lower()+ie['ieTypeName'][1:] + 'Ie'
                    ieTypeInfo['ieLocalVar'] = ie['ieTypeName'][0].lower()+ie['ieTypeName'][1:]
                    ieTypeInfo['iePresence'] = ie['presence']
                    ieTypeInfo['ieCardinality'] = ie['cardinality']
                    ieTypeInfo['instance'] = ie['instance']
                    ieTypeInfo['grouped'] = ie['grouped']
                                        
                    if ieInfo['ieType'] not in ieTypeList:   
                        ieTypeList.append(ieInfo['ieType'])
                        templateInstData['ieTypeList'] = ieTypeList
                                        
                    if ieInfo not in ieInfoList:
                                              
                        ieInfoList.append(ieInfo)
                        templateInstData['ieList'] = ieInfoList
                    
                    templateInstData['ieTypeDetails'] = {}
                    templateInstData['ieTypeDetails'][ieType] = []
                    if ieTypeInfo not in templateInstData['ieTypeDetails'][ieType]:
                        templateInstData['ieTypeDetails'][ieType].append(ieTypeInfo)
                        ieTypeDetailsList.append(templateInstData['ieTypeDetails'])
                        templateInstData['ieTypeDetails'] = ieTypeDetailsList
      
        GenerateGrpIeClass.templateInstanceprocess(templateInstData)
        outputDirCpp = 'ieClasses/'
        objectfile = outputDirCpp +templateInstData['fileName'] + '.o'
        sourcefile = outputDirCpp + templateInstData['fileName'] + '.cpp'
        xlUtils.addToMakeSo('gtpV2Stack.so',objectfile,sourcefile)
        
    def templateInstanceprocess(templateInstData):
        
        ttFileNameInstCpp = 'tts/grpieinsttemplate.cpp.tt'
        outputDir = '../../src/gtpV2Codec/ieClasses'
        ttFileNameInstH = 'tts/grpieinsttemplate.h.tt'
        xlUtils.templateProcess(templateInstData,ttFileNameInstCpp,ttFileNameInstH,outputDir,outputDir)
            
    def prepareGrpIeMakeFile():
        outputDirCpp = 'ieClasses/manual/'
        xlUtils.addToMakeSo("gtpV2Stack.so", outputDirCpp+'gtpV2GroupedIe.o',outputDirCpp+'gtpV2GroupedIe.cpp')
                    
GenerateGrpIeClass()
