import os
import time
import json
import redis
import copy
from pprint import pprint
from Charles import AssertLen

redis_gm = redis.Redis(host='localhost')


def mitm_query(**kwargs):
    '''
    1.这个方法使用一定要执行mitmdump -s maidianRedis.py --listen-port=8899'
    2.手机一定要设备代理  port 8899，代理ip为执行机的ip
    :param kwargs:  这个除了action，其他都应该是params里面的
    :return:
    '''

    def inner_filter(data):
        '''
        json.dumps()
        函数是将一个Python数据类型列表进行json格式的编码（可以这么理解，json.dumps()函数是将字典转化为字符串）
        json.loads()
        函数是将json格式数据转换为字典（可以这么理解，json.loads()函数是将字符串转化为字典）
        '''

        # data是个列表 对列表内的每个元素 反序列化 转换成 字典或者列表
        # map的作用就是 将data里面列表的每一组数据 传入前面的json.loads()进行转化字典  再用对象接收。

        # data = map(lambda x: json.loads(x), data)
        for i in range(len(data)):
            data[i] = json.loads(data[i])


        # filter 筛选自己设备号下的数据 其实没用 因为你ui走的都是你这个设备的。
        # data = filter(lambda x: x.get('device', {}).get('device_id') == "764FC20F-B97F-4F2E-868E-FC6E3042C96D", data)

        # 将data 这个列表进行循环进入  lambda这个函数 进行筛选  用例里面我们自己传进来的action 通过action的健取到对应的值
        action = kwargs.pop('action')

        # 通过type 进行第一轮筛选
        def act(x):
            return x.get('type') == action

        data = list(filter(act, data))
        pprint(data)
        # 通过健值对的方式 将params里面的数据全部取了出来。
        for k, v in kwargs.items():
            # 通过 params 进行第二轮筛选 并且形成一个健值对的形式。
            print(f'=={k}：{v}==')
            data = list(filter(lambda x,k1=k,v1=v: x.get('params', {}).get(k1) == v1, data))
            pprint(list(copy.deepcopy(data)))


        # 最后进行去重，ios部分会重复，数据端去重，这里也做去重判断
        _data = []
        for item in data:
            if item not in _data:
                _data.append(item)

        print("最终筛选结果：开始")
        pprint(_data)
        print("最终筛选结果：结束")
        return _data



    time.sleep(3)  # 等待埋点处理完毕
    # 获取redis里面所有的数据 里面传值 0，-1 指的是 获取到 maidian 这个文件里面所有的内容
    data = redis_gm.lrange('maidian', 0, -1)

    # 将redis里面的数据 传给inner_filter 随后转成列表生成对象filter_result
    filter_result = list(inner_filter(data))
    pprint(filter_result)
    device_id = filter_result[0].get("device").get("device_id")
    AssertLen.devices_id(device_id)
    return filter_result