from json import dumps, loads, JSONEncoder, JSONDecoder

from app.entity.systemconfig.SystemEnumeration import *
from app.entity.systemconfig.SystemTemplate import *
from app.entity.calculator.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.entity.strategy.Scenario import *
from app.entity.strategy.MarketInfo import *
from app.entity.strategy.Position import *
from app.entity.strategy.StrategyCalculatorDataBean import *
from app.entity.simulation.SimulationCalculatorDataBean 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()

        return JSONEncoder.default(self, obj)