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