import pymysql
import json
from functools import reduce
from pymysql.cursors import DictCursor

db = {
    'host': 'home.rogersun.online',
    'user': 'root',
    'password': 'Sxzgx1209',
    'database': 'lottery'
}


# 获取篮球为指定数值_blue时,未来range期出现各个蓝球号码的次数
def get_rate_one(_blue, _range):
    conn = pymysql.connect(**db)
    cursor = conn.cursor(DictCursor)

    cursor.execute('SELECT * FROM history WHERE blue = %s', (_blue,))
    result = cursor.fetchall()

    id_list = []
    for re in result:
        for r in range(_range):
            id_list.append(re['id'] + r + 1)
    id_list = set(id_list)

    cursor.execute('SELECT * FROM history WHERE id IN %(ids)s', {'ids': id_list})
    result = cursor.fetchall()

    cursor.close()
    conn.commit()

    result_dict = {}

    for r in result:
        b = r['blue']
        if b in result_dict.keys():
            result_dict[b] += 1
        else:
            result_dict[b] = 1
    return dict_sort(result_dict, 'val', True)


def dict_sort(_dict, _key, _reverse=False):
    if _key == "key":
        result = sorted(_dict.items(), key=lambda x: x[0], reverse=_reverse)
    else:
        result = sorted(_dict.items(), key=lambda x: x[1], reverse=_reverse)

    result_val_dict = {}
    for rv in result:
        result_val_dict[rv[0]] = rv[1]

    return result_val_dict


def dict_rate(_dict):
    _sum = reduce((lambda x, y: x + y), _dict.values())
    for k, v in _dict.items():
        _dict[k] = str(round(v / _sum * 100, 2)) + '%'
    return _dict


def get_rate(_range):
    conn = pymysql.connect(**db)
    cursor = conn.cursor(DictCursor)

    cursor.execute('SELECT * FROM history ORDER BY id DESC LIMIT %s', (_range,))
    result = cursor.fetchall()

    cursor.close()
    conn.commit()

    final_dict = {}

    for i in range(_range):
        blue = result[i]['blue']
        _sub_range = i + 1

        for k, v in get_rate_one(blue, _sub_range).items():
            if k in final_dict:
                final_dict[k] += v
            else:
                final_dict[k] = v

    return dict_sort(final_dict, 'val', True)


def update_db(_range):
    result = get_rate(_range)
    rj = json.dumps(result)
    print(result)

    conn = pymysql.connect(**db)
    cursor = conn.cursor(DictCursor)
    cursor.execute('SELECT * FROM history ORDER BY id DESC LIMIT %s', (_range,))
    db_result = cursor.fetchall()
    date_id = db_result[0]['dateId']
    # print(date_id, str(_range), rj)
    cursor.execute('SELECT * FROM blue_forecast WHERE dateId = %s AND params = %s', (date_id, str(_range)))

    if len(cursor.fetchall()) == 0:
        cursor.execute('INSERT INTO blue_forecast (dateId, params, blue) VALUES (%s, %s, %s)',
                       (date_id, str(_range), rj))
    else:
        print('已经存在对应数据,请检查:')
        print(rj)
    cursor.close()
    conn.commit()
    return result


def get_data(_range):
    conn = pymysql.connect(**db)
    cursor = conn.cursor(DictCursor)
    cursor.execute('SELECT dateId FROM blue_forecast ORDER BY id DESC LIMIT 1')
    date_id = cursor.fetchall()[0]['dateId']
    cursor.execute('SELECT * FROM blue_forecast WHERE dateId = %s AND params = %s', (date_id, str(_range)))
    data = json.loads(cursor.fetchall()[0]['blue'])

    count = 0
    for d in data.values():
        count += d
    for key, val in data.items():
        print("%s: %2.2f%%" % (key, (val / count) * 100))


def get_blue_suggest(_range):
    result_list = []
    for r in range(_range):
        result_list.append(update_db(r + 1))
    keys = [str(i + 1).rjust(2, '0') for i in range(16)]
    # print(keys)
    # print(result_list)
    result = {}
    for k in keys:
        for data in result_list:
            if k in result.keys() and k in data.keys():
                result[k] += data[k]
            elif k in result.keys():
                result[k] += 0
            else:
                result[k] = data[k]
    print(f'推荐的篮球结果,未来{str(_range)}期历史数据统计总和:')
    for k,v in dict_rate(dict_sort(result, 'val', True)).items():
        print(f"{k} - {v}")


if __name__ == "__main__":
    range_num = 5
    get_blue_suggest(range_num)
    # get_data(range_num)