from json import dumps, loads, JSONEncoder, JSONDecoder

from app.entity.systemconfig.SystemEnumeration import *
from app.entity.systemconfig.SystemTemplate import *
from app.processor.calculator.entity.CalculatorDataBean import *
from app.resource.PagerInfo import PagerInfo
from app.resource.ResultWrapper import ResultWrapper
from app.entity.product.Options import *
from app.entity.product.Stock import *
from app.entity.product.ChartDataBean import *
from app.processor.strategy.entity.Scenario import *
from app.processor.strategy.entity.MarketInfo import *
from app.processor.strategy.entity.Position import *
from app.processor.strategy.entity.StrategyCalculatorDataBean import *
from app.processor.simulation.entity.SimulationCalculatorDataBean import *

from app.processor.stockprofiling.entity.StockProfilingDataBean import * 
from app.processor.stockprofiling.entity.StockReturnProfiles import * 
from app.processor.stockprofiling.entity.HistoricalVolatilities import * 
from app.processor.stockprofiling.entity.StandardDeviationBuckets import * 


class CustomerJSONEncoder(JSONEncoder):
    def default(self, obj):
        if isinstance(obj, set):
            return list(obj)
        
        if isinstance(obj, ResultWrapper):
            return obj.serialize()
        if isinstance(obj, PagerInfo):
            return obj.serialize()
        
        if isinstance(obj, SystemEnumeration):
            return obj.serialize()
        if isinstance(obj, SystemTemplate):
            return obj.serialize()
        
        
        if isinstance(obj, Options):
            return obj.serialize()
        if isinstance(obj, Stock):
            return obj.serialize()
        if isinstance(obj, CalculatorDataBean):
            return obj.serialize()
        if isinstance(obj, ChartDataBean):
            return obj.serialize()
        
        if isinstance(obj, MarketInfo):
            return obj.serialize()
        if isinstance(obj, Position):
            return obj.serialize()
        if isinstance(obj, Scenario):
            return obj.serialize()
        if isinstance(obj, StrategyCalculatorDataBean):
            return obj.serialize()

        if isinstance(obj, SimulationCalculatorDataBean):
            return obj.serialize()
        
        if isinstance(obj, StockProfilingDataBean):
            return obj.serialize()
        if isinstance(obj, StockReturnProfiles):
            return obj.serialize()
        if isinstance(obj, HistoricalVolatilities):
            return obj.serialize()
        if isinstance(obj, StandardDeviationBuckets):
            return obj.serialize()

        return JSONEncoder.default(self, obj)