import clr
from System import Type
from System import AppDomain
from System.Reflection import Assembly
from Spotfire.Dxp.Data import DataPropertyClass,DataProperty,DataType

def createDataViz(datavizTypeName):
    visualCollectionType = Document.ActivePageReference.Visuals.GetType()
    dataVizType = None
    for assembly in AppDomain.CurrentDomain.GetAssemblies():
	    if(assembly.FullName.Contains('Spotfire.Dxp.Application,')):
		    for type in assembly.GetTypes():
			    if(type.FullName == 'Spotfire.Dxp.Application.Visuals.' + datavizTypeName):
				    dataVizType = type
				    break
	    if (dataVizType != None):
		    break;
    addNewMethod = None
    for method in visualCollectionType.GetMethods():
	    if((method.Name == 'AddNew') and method.IsGenericMethod):
		    addNewMethod = method
		    break
    addNewGenericMethod = addNewMethod.MakeGenericMethod(dataVizType)
    return addNewGenericMethod.Invoke(Document.ActivePageReference.Visuals, None)

def applyGeneralProperties( datavizToChange, visualStateGeneralSection):
    title = clr.Reference[object]()
    description = clr.Reference[object]()
    isTitleShown = clr.Reference[object]()
    if(visualStateGeneralSection.TryGetValue('title', title)):
        dataviz.Title = title.Value
    if(visualStateGeneralSection.TryGetValue('description', description)):
        dataviz.Description = description.Value
    if(visualStateGeneralSection.TryGetValue('isTitleShown', isTitleShown)):
        dataviz.Visual.ShowTitle = isTitleShown.Value

def applyDataProperties(datavizToChange, visualStateDataSection):
    tableName = clr.Reference[object]()
    markingName = clr.Reference[object]()
    isDataLimitedToMarked = clr.Reference[object]()
    if(visualStateDataSection.TryGetValue('dataTableName', tableName) and tableName.Value != None):
        datavizToChange.Data.DataTableReference = Document.Data.Tables[tableName.Value]
    if(visualStateDataSection.TryGetValue('markingName', markingName) and markingName.Value != None):
        marking = Document.Data.Markings[markingName.Value]
        datavizToChange.Data.DataMarkingSelection = marking
        if(visualStateDataSection.TryGetValue('isDataLimitedToMarked', markingName) and markingName.Value != None):
            datatvizToChange.Data.Filtering.Add(marking)

def applyVisualState(datavizToChange, datavizType, visualState):
    generalProperties = visualState['general']
    applyGeneralProperties(datavizToChange, generalProperties)
    dataProperties = visualState['data']
    applyDataProperties(datavizToChange, dataProperties)
    #TODO : add a switch to apply specific properties for each specific dataviz

#def setReturnValue(returnObject):
#    scriptResultPropertyName = 'DiscngineScriptResult'
#    property = DataProperty.CreateCustomPrototype(scriptResultPropertyName, 'Script result', '', DataType.String, DataProperty.DefaultAttributes)
#    Document.Data.Properties.AddProperty(DataPropertyClass.Document, property)

datavizTypeName = jsonParam['type']
print datavizTypeName

dataviz = createDataViz(datavizTypeName)
dataviz.AutoConfigure()
applyVisualState(dataviz, datavizTypeName, jsonParam['visualState'])



