from app.resource.ResourceConstant import *

from app.processor.strategy.StrategyCalculatorProcessor import *
from app.entity.strategy.StrategyCalculatorDataBean import *

class SimulationCalculatorProcessor:
    @staticmethod
    def calculate(simulationCalculatorDataBean):
        strategyParameters = {
                          "scenario": simulationCalculatorDataBean.scenario,
                          "axisMin": simulationCalculatorDataBean.axisMin,
                          "axisMax" : simulationCalculatorDataBean.axisMax
                          }

        scenarioResultsDict = {}
        chartDataBeanDict = {}
            
        for strategyName in simulationCalculatorDataBean.strategyNames:
            strategyParameters["marketInfo"] = simulationCalculatorDataBean.marketInfoDict.get(strategyName)
            strategyParameters["portfolio"] = simulationCalculatorDataBean.scenarioResultsDict.get(strategyName)
            strategyParameters["scenarioResults"] = simulationCalculatorDataBean.scenarioResultsDict.get(strategyName)
            strategyCalculatorDataBean = StrategyCalculatorDataBean(**strategyParameters)
        
            StrategyCalculatorProcessor.calculateOptionsByDaysElapsed(strategyCalculatorDataBean)
            scenarioResultsDict[strategyName] = strategyCalculatorDataBean.scenarioResults
        
            chartResult = StrategyCalculatorProcessor.calculateChart(strategyCalculatorDataBean)
            chartDataBeanDict[strategyName] = chartResult
            simulationCalculatorDataBean.axisMin = strategyCalculatorDataBean.axisMin
            simulationCalculatorDataBean.axisMax = strategyCalculatorDataBean.axisMax
        
        simulationCalculatorDataBean.scenarioResultsDict = scenarioResultsDict
        simulationCalculatorDataBean.chartDataBeanDict = chartDataBeanDict
    
    @staticmethod
    def calculateChart(simulationCalculatorDataBean):
        strategyParameters = {
                          "scenario": simulationCalculatorDataBean.scenario,
                          "axisMin": simulationCalculatorDataBean.axisMin,
                          "axisMax" : simulationCalculatorDataBean.axisMax
                          }

        chartDataBeanDict = {}
        for strategyName in simulationCalculatorDataBean.strategyNames:
            strategyParameters["marketInfo"] = simulationCalculatorDataBean.marketInfoDict[strategyName]
            strategyParameters["portfolio"] = simulationCalculatorDataBean.scenarioResultsDict.get(strategyName)
            strategyParameters["scenarioResults"] = simulationCalculatorDataBean.scenarioResultsDict[strategyName]
            strategyCalculatorDataBean = StrategyCalculatorDataBean(**strategyParameters)
        
            chartResult = StrategyCalculatorProcessor.calculateChart(strategyCalculatorDataBean)
            chartDataBeanDict["'" + strategyName + "'"] = chartResult
            simulationCalculatorDataBean.axisMin = strategyCalculatorDataBean.axisMin
            simulationCalculatorDataBean.axisMax = strategyCalculatorDataBean.axisMax
        
        simulationCalculatorDataBean.chartDataBeanDict = chartDataBeanDict

    @staticmethod
    def calculateScenario(simulationCalculatorDataBean):
        strategyParameters = {
                          "scenario": simulationCalculatorDataBean.scenario,
                          "axisMin": simulationCalculatorDataBean.axisMin,
                          "axisMax" : simulationCalculatorDataBean.axisMax
                          }

        scenarioResultsDict = {}
        for strategyName in simulationCalculatorDataBean.strategyNames:
            strategyParameters["marketInfo"] = simulationCalculatorDataBean.marketInfoDict[strategyName]
            strategyParameters["portfolio"] = simulationCalculatorDataBean.scenarioResultsDict.get(strategyName)
            strategyParameters["scenarioResults"] = simulationCalculatorDataBean.scenarioResultsDict[strategyName]
            strategyCalculatorDataBean = StrategyCalculatorDataBean(**strategyParameters)
        
            StrategyCalculatorProcessor.calculateOptionsByDaysElapsed(strategyCalculatorDataBean)
            scenarioResultsDict["'" + strategyName + "'"] = strategyCalculatorDataBean.scenarioResults
        
        simulationCalculatorDataBean.scenarioResultsDict = scenarioResultsDict
     