import db
import time
import os
import tushare as ts
import threading
import time
import history_fp as history


# print(len(codes))
# for x in codes:
#     print(x)
# df = ts.get_hist_data(x[0], start=from_day, end=to_day)


# exitFlag = 0
#
class myThread(threading.Thread):
    def __init__(self, threadID, name, counter, from_day, pre_day):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter
        self.from_day = from_day
        self.pre_day = pre_day

    def run(self):
        print("开始线程：" + self.name)
        print_time(self.name, self.counter, self.from_day, self.pre_day)
        print("退出线程：" + self.name)


def print_time(threadName, counter, from_day, pre_day):
    mysql2 = db.MY_SQL()
    for i in counter:
        df = ts.get_hist_data(i[0], start=from_day, end=from_day)
        # print(df)
        if df is not None:
            for j in df.index:
                time.sleep(0.5)
                mysql2.insert_now_fp_table(i[0], i[1], df.loc[j]['p_change'], df.loc[j]['close'], threadName)

                print(from_day)
                print(pre_day)
                # 查询profit是否有相同code
                profit = mysql2.get_pre_day_data(i[0], pre_day)
                print(profit)
                if profit is not None:
                    # 取开盘价
                    price = df.loc[j]['open']
                    print(i[0])
                    print(profit[2])

                    if i[0] == profit[2]:
                        old_price = profit[5]
                        p = float(price) - float(old_price)
                        mysql2.cale_profit(profit[0], p)


# 按日期查询历史数据
def get_hist_day_data(from_day, pre_day):
    # 查询所有代码
    mysql = db.MY_SQL()
    codes = mysql.getListForCate('')
    codeList = []
    for i in range(0, 30):
        d = mysql.getPageForCate(i*100, 100)
        codeList.append(d)

    print(codeList)

    # 清空当前行情表
    mysql.init_now_fp_table()

    tt = []
    # 创建新线程
    for i in range(30):
        thread1 = myThread(i, "Thread-" + str(i), codeList[i], from_day, pre_day)
        # 开启新线程
        thread1.start()
        # thread1.join()
        # 记录线程
        tt.append(thread1)
    # 等待所有线程执行完成
    for i in tt:
        i.join()

    print("主线程")

    # 接近涨停的票数据
    maxData = []

    # 从表获取当天数据
    now_datas = mysql.get_now_fp('')
    # 取出涨幅接近涨停的票
    for i in now_datas:
        if float(i[3]) > 9.6:
            # print(d['code'] + " " + d['name'])
            v = {'code': i[1], 'name': i[2], 'percent': i[3]}
            maxData.append(v)

    # 给接近涨停的票加上[行业分类]参数
    for i in range(len(maxData)):
        for j in codes:
            if maxData[i]['code'] == j[0]:
                maxData[i]['cate'] = j[2]

    # 排序参数，取第2位排序
    def take_second(elem):
        return elem[1]

    # 排序参数，取第4位排序
    def take_four(elem):
        return elem[3]

    # 取出接近涨停票中的cate分类
    # 并计算出现每个分类的次数
    # 目的是取出[热门行业]
    cates = {}
    for i in range(len(maxData)):
        key = maxData[i].get('cate')
        if key in cates:
            num = cates.get(key) + 1
        else:
            num = 1
        cates[key] = num

    # 分类排序并取出排名
    sorts = []
    cate_list = list(cates.items())
    cate_list.sort(key=take_second, reverse=True)

    if cate_list is None or len(cate_list) < 6:
        return

    # 取行业排名前6
    for i in range(0, 6):
        if cate_list[i][0] is not None:
            sorts.append(cate_list[i][0])

    print('\n')
    print(sorts)

    # 清空历史表
    mysql.clear_history_fp()
    # 处理每个行业的数据
    for i in range(len(sorts)):
        # 取出同行业全部票
        stocks = mysql.getListForCate(sorts[i])
        stockPercent = []
        for i in range(len(stocks)):
            code = stocks[i][0]
            # 查询票当前涨幅
            p = mysql.getfpPercent(code)
            for j in p:
                s = (float(j[0]),)
                a = stocks[i] + s
                stockPercent.append(a)
        # 根据涨幅排序
        stockPercent.sort(key=take_four, reverse=True)
        # print(stockPercent)

        for z in range(len(stockPercent)):
            if 3 <= float(stockPercent[z][4]):
                # print(stockPercent[z])
                # 查询单个的180天历史高位数据，并保存到数据库
                history.query_stock_history(mysql, from_day, stockPercent[z][0],
                                            stockPercent[z][1],
                                            stockPercent[z][2])

    # 处理每个行业的数据
    for x in range(len(sorts)):
        stocks = mysql.getListForCate(sorts[x])
        stockPercent = []
        for i in range(len(stocks)):
            code = stocks[i][0]
            p = mysql.getfpPercent(code)
            for j in p:
                s = (float(j[0]),)
                a = stocks[i] + s
                # print(a)
                stockPercent.append(a)
        # 根据涨幅排序
        stockPercent.sort(key=take_four, reverse=True)
        # print(stockPercent)

        # 今日龙头
        maxPercent = []
        for i in range(len(stockPercent)):
            # 取出今天行业的领涨龙头
            if 9.8 <= float(stockPercent[i][4]):
                maxPercent.append(stockPercent[i])

        # print(maxPercent)

        allStr = ''
        for i in maxPercent:
            # 查询龙头历史数据
            days = mysql.selectDayFp(i[0])
            for j in days:
                result = mysql.selectRelationStocksFp(j[4], i[2])
                # print(str(result))
                allStr += str(result)
        # print(allStr)

        # 处理字符
        allStr = allStr.replace("(", "")
        allStr = allStr.replace(")", "")
        allStr = allStr.replace("'", "")
        allStr = allStr.replace(",,", ",")
        allStr = allStr.replace(" ", "")
        # print(allStr)

        # 移除重复字符
        sortList = []
        for i in allStr.split(','):
            if i != '':
                d = (i, allStr.count(i))
                if sortList.count(d) <= 0:
                    sortList.append(d)
        sortList.sort(key=take_second, reverse=True)
        # print(sortList)

        result = []
        for i in sortList:
            # 查询历史中高位出现的次数
            num = mysql.selectCountFp(i[0])[0]
            if num >= 3:
                # 查询实时行情
                # df = ts.get_realtime_quotes(i[0])
                p = 0
                price = 0
                n = ''

                # 从保存的实时信息中取出
                df = mysql.get_now_fp(i[0])
                for j in df:
                    p = j[3]
                    price = j[4]
                    n = j[2]

                # 过滤百分比太高和太低的数据
                if 1 <= float(p) <= 7:
                    # 查询15天内的上升趋势
                    t = history.query_month_history(i[0], from_day)
                    if t[0]:
                        value = (i[0] + ' ' + n, price, str(p) + "%", t[1], num)
                        result.append(value)
                        # 保存结果到数据库
                        print(value)
                        mysql.save_to_profit(from_day, i[0], n, sorts[x], price)


pro = ts.pro_api(token='233302841e61938a0e1b77e74dd6fe86703e0a5ddece3544569c9017')
cal = pro.query('trade_cal', start_date='20180801', end_date='20190417')

run_day = []
for i in cal.index:
    if cal.loc[i][2] == 1:
        day = cal.loc[i][1]
        y = day[:4]
        m = day[:6][4:]
        d = day[6:]
        run_day.append(y+'-'+m+'-'+d)

for i in range(len(run_day)):
    # 按日期取历史数据
    if i > 0:
        get_hist_day_data(run_day[i], run_day[i-1])
    else:
        get_hist_day_data(run_day[i], run_day[i])
