import pandas as pd

from app.entity.product.ChartDataBean import *

class CalculatorDataBean:
    
    def __init__(self, model='BlackSholes', optionType='European', stockPrice=100., strike=100., volatility=0.3, 
                 expiration=365., maturityUnit='InDays', dividendYield=0., riskfreeRate=0.02, 
                 code = 'CalculatorDataBean', entityType = 'CalculatorDataBean',
                 callValue = 0., callDelta = 0., callGamma = 0., callVega = 0., callTheta = 0., callRho = 0.,
                 putValue = 0., putDelta = 0., putGamma = 0., putVega = 0., putTheta = 0., putRho = 0.,
                 callPremium = 12.76, callImpliedVolatility = 0., putPremium = 10.88, putImpliedVolatility = 0.,
                 axisName = 'stockPrice', axisMin = 0., axisMax = 0., chartDataBean = None):
        self.code = code
        self.entityType = 'CalculatorDataBean'
        
        self.model = model
        self.optionType = optionType
        self.stockPrice = float(stockPrice)
        self.strike = float(strike)
        self.volatility = float(volatility)
        self.expiration = float(expiration)
        self.maturityUnit = maturityUnit
        self.dividendYield = float(dividendYield)
        self.riskfreeRate = float(riskfreeRate)
        
        self.callValue = float(callValue)
        self.callDelta = float(callDelta)
        self.callGamma = float(callGamma)
        self.callVega = float(callVega)
        self.callTheta = float(callTheta)
        self.callRho = float(callRho)

        self.callPremium = float(callPremium)
        self.callImpliedVolatility = float(callImpliedVolatility)
        
        self.putValue = float(putValue)
        self.putDelta = float(putDelta)
        self.putGamma = float(putGamma)
        self.putVega = float(putVega)
        self.putTheta = float(putTheta)
        self.putRho = float(putRho)

        self.putPremium = float(putPremium)
        self.putImpliedVolatility = float(putImpliedVolatility)
        
        self.axisName = axisName
        self.axisMin = float(axisMin)
        self.axisMax = float(axisMax)
        if chartDataBean is not None:
            self.chartDataBean = chartDataBean
        else:
            self.chartDataBean = ChartDataBean()
            

    def serialize(self):
        return {
                "code": self.code,
                "entityType": self.entityType,
                "model": self.model,
                "optionType": self.optionType,
                "stockPrice": self.stockPrice,
                "strike": self.strike,
                "volatility": self.volatility,
                "expiration": self.expiration,
                "maturityUnit": self.maturityUnit,
                "dividendYield": self.dividendYield,
                "riskfreeRate": self.riskfreeRate,
                "callValue": self.callValue,
                "callDelta": self.callDelta,
                "callGamma": self.callGamma,
                "callVega": self.callVega,
                "callTheta": self.callTheta,
                "callRho": self.callRho,
                "callPremium": self.callPremium,
                "callImpliedVolatility": self.callImpliedVolatility,
                "putValue": self.putValue,
                "putDelta": self.putDelta,
                "putGamma": self.putGamma,
                "putVega": self.putVega,
                "putTheta": self.putTheta,
                "putRho": self.putRho,
                "putPremium": self.putPremium,
                "putImpliedVolatility": self.putImpliedVolatility,
                "axisName": self.axisName,
                "axisMin": self.axisMin,
                "axisMax": self.axisMax,
                "chartDataBean": self.chartDataBean,
                }