from flask import Blueprint, request

from app.resource.ResourceConstant import *

from app.processor.strategy.StrategyDataLoader import *
from app.processor.strategy.StrategyCalculatorProcessor import *
from app.processor.strategy.StrategyCalculatorDataBeanBuilder import *
from app.entity.strategy.StrategyCalculatorDataBean import *

from app.resource.ResponseBuilder import *


mod = Blueprint('strategy', __name__, url_prefix=ResourceConstant.STRATEGY)

@mod.route(ResourceConstant.STRATEGY_CALC, methods=['POST'])
def calculate_post():
    parameters = request.get_json(force=True)
    userId = request.headers.get('token')
    if userId is None or userId == "":
        userId = 'guest'
    
    strategyCalculatorDataBean =  StrategyCalculatorDataBeanBuilder.build(parameters)
    
    StrategyCalculatorProcessor.calculateOptions(strategyCalculatorDataBean)
    StrategyCalculatorProcessor.calculateOptionsByDaysElapsed(strategyCalculatorDataBean)
    
    chartResult = StrategyCalculatorProcessor.calculateChart(strategyCalculatorDataBean)
    strategyCalculatorDataBean.chartDataBean = chartResult

    resultWrapper = ResultWrapper(strategyCalculatorDataBean)
    return ResponseBuilder.build(resultWrapper)        

@mod.route(ResourceConstant.STRATEGY_CALC_CHART, methods=['POST'])
def calculateChart():
    parameters = request.get_json(force=True)
    userId = request.headers.get('token')
    if userId is None or userId == "":
        userId = 'guest'
    
    strategyCalculatorDataBean =  StrategyCalculatorDataBeanBuilder.build(parameters)

    StrategyCalculatorProcessor.calculateOptionsByDaysElapsed(strategyCalculatorDataBean)
    chartResult = StrategyCalculatorProcessor.calculateChart(strategyCalculatorDataBean)

    strategyCalculatorDataBean.chartDataBean = chartResult

    resultWrapper = ResultWrapper(strategyCalculatorDataBean)
    return ResponseBuilder.build(resultWrapper)        

@mod.route(ResourceConstant.STRATEGY_CALC_SCENARIO, methods=['POST'])
def calculateScenario():
    parameters = request.get_json(force=True)
    userId = request.headers.get('token')
    if userId is None or userId == "":
        userId = 'guest'
    
    strategyCalculatorDataBean =  StrategyCalculatorDataBeanBuilder.build(parameters)

    StrategyCalculatorProcessor.calculateOptionsByDaysElapsed(strategyCalculatorDataBean)

    resultWrapper = ResultWrapper(strategyCalculatorDataBean)
    return ResponseBuilder.build(resultWrapper)        


@mod.route(ResourceConstant.STRATEGY_CALC_OPTIONS, methods=['POST'])
def calculateOptions():
    parameters = request.get_json(force=True)
    userId = request.headers.get('token')
    if userId is None or userId == "":
        userId = 'guest'
    
    strategyCalculatorDataBean =  StrategyCalculatorDataBeanBuilder.build(parameters)

    StrategyCalculatorProcessor.calculateOptions(strategyCalculatorDataBean)

    resultWrapper = ResultWrapper(strategyCalculatorDataBean)
    return ResponseBuilder.build(resultWrapper)        

