from framework import read, write, where, format_date
from api import PortfoliosRisk

__COLUMNS__ = {
    'rwd_id': 'id',
    'rwd_date': 'date',
    'rwd_risk': 'risk',
    'rwd_weight': 'weight',
    'rwd_drift': 'drift',
}


@read(one=True)
def get_one(day, risk: PortfoliosRisk):
    return f"select {','.join([f'{x[0]} as {x[1]}' for x in __COLUMNS__.items()])} from robo_weight_drift {where(rwd_date=day, rwd_risk=risk)}"


@read(one=True)
def get_last_one(max_date, risk: PortfoliosRisk):
    return f'''
    select {','.join([f'{x[0]} as {x[1]}' for x in __COLUMNS__.items()])} from robo_weight_drift 
    {where(f"rwd_date <= '{format_date(max_date)}'", rwd_risk=risk)} order by rwd_date desc limit 1
    '''





@write
def insert(datas):
    datas = {x[0]: datas[x[1]] for x in __COLUMNS__.items() if x[1] in datas and datas[x[1]] is not None}
    datas = {
        **datas,
        **{x[0]: format_date(x[1]) for x in datas.items() if isinstance(x[1], datetime)},
        **{x[0]: x[1].value for x in datas.items() if isinstance(x[1], Enum)}
    }
    return f'''
    insert into robo_weight_drift({','.join([x for x in datas.keys()])})
    values ({','.join([f"'{x[1]}'" for x in datas.items()])})
    '''