from flask import Blueprint, request, jsonify, abort, Response

from app.entity.calculator.CalculatorDataBean import CalculatorDataBean
from app.processor.calculator.EuropeanOptionCalculator import EuropeanOptionCalculator
from app.processor.calculator.ImpliedVolatilityCalculator import ImpliedVolatilityCalculator

from app.resource.CustomerJSONEncoder import *
from app.resource.ResourceConstant import ResourceConstant
from app.resource.ResultWrapper import *
from app.resource.ResponseBuilder import *

mod = Blueprint('calculator', __name__, url_prefix=ResourceConstant.CALCULATOR)

@mod.route(ResourceConstant.CALCULATOR_CALC, methods=['POST'])
def calculate_json_post():
        parameters = request.get_json(force=True)
        
        dataBean = CalculatorDataBean(**parameters)
             
        dataBean = ImpliedVolatilityCalculator.calculate(dataBean)
        dataBean = EuropeanOptionCalculator.calculate(dataBean)
        
        result = EuropeanOptionCalculator.calculateChart(dataBean)
        dataBean.chartDataBean = result
            
        resultWrapper = ResultWrapper(dataBean)
        return ResponseBuilder.build(resultWrapper)


@mod.route(ResourceConstant.CALCULATOR_CALC, methods=['GET'])
def calculate_json_get():
       
    dataBean = CalculatorDataBean()
    
    dataBean = ImpliedVolatilityCalculator.calculate(dataBean)
    dataBean = EuropeanOptionCalculator.calculate(dataBean);

    result = EuropeanOptionCalculator.calculateChart(dataBean)
    dataBean.chartDataBean = result
        
    resultWrapper = ResultWrapper(dataBean)
    return ResponseBuilder.build(resultWrapper)
    


@mod.route(ResourceConstant.CALCULATOR_CALCHART, methods=['POST'])
def calculate_chart():
        parameters = request.get_json(force=True)
        
        dataBean = CalculatorDataBean(**parameters)
             
        #dataBean = ImpliedVolatilityCalculator.calculate(dataBean)
        #dataBean = EuropeanOptionCalculator.calculate(dataBean)
        
        result = EuropeanOptionCalculator.calculateChart(dataBean)
        dataBean.chartDataBean = result

            
        resultWrapper = ResultWrapper(dataBean)
        return ResponseBuilder.build(resultWrapper)