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():

        #return ResponseBuilder.build("success.")

        parameters = request.get_json(force=True)
        print ("parameters:", parameters)
        
        dataBean = CalculatorDataBean(**parameters)
             
        dataBean = ImpliedVolatilityCalculator.calculate(dataBean)
        dataBean = EuropeanOptionCalculator.calculate(dataBean)
            
        resultWrapper = ResultWrapper([dataBean])
        
        return ResponseBuilder.build(resultWrapper)


@mod.route(ResourceConstant.CALCULATOR_CALC, methods=['GET'])
def calculate_json_get():
        
        stockPrice = 100.
        strike = 100.
        expiryDays = 365
        volatility = 0.3
        dividendYield = 0.001
        riskfreeRate = 0.02
        optionType = 'European'
        
        dataBean = CalculatorDataBean(stockPrice, strike, volatility, expiryDays, dividendYield, riskfreeRate, optionType)
        dataBean = EuropeanOptionCalculator.calculate(dataBean);
        
        resultWrapper = ResultWrapper([dataBean])
        
        return ResponseBuilder.build(resultWrapper)
    
