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)
        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():
    dict = {
            'model':'BlackSholes',
            'stockPrice': 100.,
            'strike': 100.,
            'expiration': 365.,
            'maturityUnit': 'InDays',
            'volatility': 0.3,
            'dividendYield': 0.001,
            'riskfreeRate': 0.02,
            'optionType': 'European',
            'callPremium': 12.76,
            'putPremium': 10.88,
            }
        
    dataBean = CalculatorDataBean(**dict)
    
    dataBean = ImpliedVolatilityCalculator.calculate(dataBean)
    dataBean = EuropeanOptionCalculator.calculate(dataBean);
        
    resultWrapper = ResultWrapper([dataBean])
        
    return ResponseBuilder.build(resultWrapper)
    


@mod.route(ResourceConstant.CALCULATOR_CALCHART, methods=['POST'])
def calculate_chart():
        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)