from app.model.BlackScholesCalculator import *
from app.entity.ConstantValue import ConstantValue

class EuropeanOptionCalculator:
    @staticmethod
    def calculate(calculatorDataBean):
        stockPrice = float(calculatorDataBean.stockPrice)
        strike = float(calculatorDataBean.strike)
        expiryYears = float(calculatorDataBean.expiration)
        if calculatorDataBean.maturityUnit == 'InDays':
            expiryYears = expiryYears / 365.
        volatility = float(calculatorDataBean.volatility)
        dividendYield = float(calculatorDataBean.dividendYield)
        riskfreeRate = float(calculatorDataBean.riskfreeRate)
                
        bs = BlackScholesCalculator()
        
        calculatorDataBean.callValue = bs.getValue('call', stockPrice, strike, volatility, expiryYears, dividendYield, riskfreeRate)
        calculatorDataBean.callDelta = bs.getDelta('call', stockPrice, strike, volatility, expiryYears, dividendYield, riskfreeRate)
        calculatorDataBean.callGamma = bs.getGamma(stockPrice, strike, volatility, expiryYears, dividendYield, riskfreeRate)
        calculatorDataBean.callTheta = bs.getTheta('call', stockPrice, strike, volatility, expiryYears, dividendYield, riskfreeRate)
        calculatorDataBean.callVega = bs.getVega(stockPrice, strike, volatility, expiryYears, dividendYield, riskfreeRate)
        calculatorDataBean.callRho = bs.getRho('call', stockPrice, strike, volatility, expiryYears, dividendYield, riskfreeRate)

        calculatorDataBean.putValue = bs.getValue('put', stockPrice, strike, volatility, expiryYears, dividendYield, riskfreeRate)
        calculatorDataBean.putDelta = bs.getDelta('put', stockPrice, strike, volatility, expiryYears, dividendYield, riskfreeRate)
        calculatorDataBean.putTheta = bs.getTheta('put', stockPrice, strike, volatility, expiryYears, dividendYield, riskfreeRate)
        calculatorDataBean.putGamma = calculatorDataBean.callGamma
        calculatorDataBean.putVega = calculatorDataBean.callVega
        calculatorDataBean.putRho = bs.getRho('put', stockPrice, strike, volatility, expiryYears, dividendYield, riskfreeRate)
        
        return calculatorDataBean
    