from app.model.NewtonRaphson import NewtonRaphson

from app.entity.ConstantValue import *

class ImpliedVolatilityCalculator:
    @staticmethod
    def calculate(calculatorDataBean):
        stockPrice = float(calculatorDataBean.stockPrice)
        strike = float(calculatorDataBean.strike)
        expiryYears = float(calculatorDataBean.expiration)
        if calculatorDataBean.maturityUnit == 'InDays':
            expiryYears = expiryYears / 365.
        dividendYield = float(calculatorDataBean.dividendYield)
        riskfreeRate = float(calculatorDataBean.riskfreeRate)
        
        
        nr = NewtonRaphson()
        
        volatility = nr.calculateVolatility(calculatorDataBean.callPremium, ConstantValue.CALL, 
                                            stockPrice, strike, expiryYears, dividendYield, riskfreeRate)
        calculatorDataBean.callImpliedVolatility = volatility
            
        volatility = nr.calculateVolatility(calculatorDataBean.putPremium, ConstantValue.PUT, 
                                            stockPrice, strike, expiryYears, dividendYield, riskfreeRate)
        calculatorDataBean.putImpliedVolatility = volatility
            
        return calculatorDataBean
    