from dspt_api.util.general.handle_redis import get_data_from_redis, get_param_from_redis
from dspt_api.util.general.handle_ecard import get_ecard_level, get_ecard
from dspt_api.util.general.handle_float import f2


# 将接口请求的数据中卖品信息整理成列表结构
def format_goods(_data):
    goods_list = []
    for cate in _data['res']['data']:
        for g in cate['goods']:
            goods_list.append(g)
    return {'res': {'status': _data['res']['status'], 'data': goods_list}}


# 将接口获取的卖品数据转化成请求参数格式
def general_goods_field(_data, ecard_level=None):
    params = []
    total_cash = 0
    for g in _data:
        _num = g.get('buy_num', 1)
        info = {
            'id': g['id'],
            'type': g['type'],
            'price': str(get_goods_price(g, _num, ecard_level=ecard_level)),
            'num': _num
        }
        if g['type'] == 'package' and g['packageType'] == '2':
            add_price = f2(0)
            optional_package = []
            for key, val in g['user_select'].items():
                member = []
                member_id = []
                for m in val['data']:
                    if m['id'] in member_id:
                        for item in member:
                            if item['id'] == m['id']:
                                item['num'] = item['num'] + 1
                                add_price += f2(m['addPrice'])
                    else:
                        member.append({'id': m['id'], 'num': 1, 'add_price': m['addPrice']})
                        member_id.append(m['id'])
                        add_price += f2(m['addPrice'])
                optional_package.append({'index': key, 'members': member})
            info['optional_package'] = optional_package
            info['price'] = str(f2(info['price']) + add_price)
        total_cash = f2(total_cash) + f2(info['price'])
        params.append(info)
        if g.get('discount1', False):
            total_discount = f2(0)
            discount_list = []
            if g['discount1'] > 0:
                total_discount += f2(g['discount1'])
                discount_list.append(
                    {"discount_price": g['discount1'], "discount_name": f"现金优惠券{str(g['discount1'])}元"})
            if g['discount2'] > 0:
                total_discount += f2(g['discount2'])
                discount_list.append(
                    {"discount_price": g['discount2'], "discount_name": f"现金优惠券{str(g['discount2'])}元"})
            if len(discount_list) > 0:
                info['discount_price'] = str(total_discount)
                info['discount_detail'] = discount_list
            total_cash -= total_discount

    print('general_goods_param---------params', params)
    return params, str(total_cash)


def get_goods_price(goods, num, ecard_level=None):
    price = goods.get('partnerPrice', goods['onlinePrice']) if ecard_level is None else get_ecard_price(goods,
                                                                                                        ecard_level)
    return f2(price)


def get_ecard_price(goods, ecard_level):
    if ecard_price_list := goods.get('ecardPrices', False):
        for ecard_price_item in ecard_price_list:
            if ecard_price_item['ecardLevelNo'] == ecard_level:
                return ecard_price_item['ecardLevelPrice']
    return False


def general_goods_params(pay_type, data, ticket_cash=f2(0)):
    # 券信息
    quan = ''
    # redis_key 前缀
    redis_key_prefix = f'dspt_api_{data["ip"]}_{data["env"]}_{data["member_type"]}_{data["pid"]}_{data["cid"]}'
    # 获取卖品数据
    request_api = {'name': '3.2.1 获取卖品列表', 'path': 'cinema/goods'}
    redis_key_api = f'{redis_key_prefix}_{request_api["path"]}'
    result, _format, goods_data, _timestamp = get_data_from_redis(redis_key_api)
    if result is False:
        return False, None, None, None
    if pay_type == 'cash':
        goods_field, goods_cash = general_goods_field(goods_data)
        goods_cash = f2(goods_cash)
        goods_cash += ticket_cash
    elif pay_type == 'ecard':
        ecard_num = get_ecard(data['ip'], data["env"], data["pid"], data["cid"])
        ecard_level = get_ecard_level(ecard_num)
        goods_field, goods_cash = general_goods_field(goods_data, ecard_level)
        goods_cash = f2(goods_cash)
        goods_cash += ticket_cash
    elif pay_type in ['yushouquan', 'equan']:
        goods_field, goods_cash = general_goods_field(goods_data)
        # 获取券价格
        request_api_yushouquan = {'name': '3.6.1 添加券', 'path': 'seat/check-coupon'}
        redis_key_api_yushouquan = f'{redis_key_prefix}_{request_api_yushouquan["path"]}'
        result_yushouquan, _format_yushouquan, cash_from_yushouquan, _timestamp_yushouquan = get_data_from_redis(
            redis_key_api_yushouquan)
        if not result_yushouquan:
            return False, None, None, None, None, None, None, None
        # 获取券码
        req_params = get_param_from_redis(redis_key_api_yushouquan)
        if pay_type == 'yushouquan':
            quan = req_params['coupons'] if req_params.get('coupons', False) else '3.6.1添加券接口中选择的券类型为会员卡赠券,与当前设置不符合'
        elif pay_type == 'equan':
            quan = req_params['card_coupons'] if req_params.get('equan', False) else '3.6.1添加券接口中选择的券类型为扫码券,与当前设置不符合'
        else:
            quan = '请检查3.6.1添加券接口'
        goods_cash = cash_from_yushouquan['balance']
        return True, goods_field, goods_cash, quan, _timestamp_yushouquan
    else:
        pass
    return True, goods_field, str(goods_cash), quan, _timestamp