"""给木偶写的一些工具函数
"""
import configparser
import ctypes
import datetime
import io
import os
import time

from ctypes.wintypes import WORD, DWORD

try:
    import pandas as pd
except Exception as e:
    print(e)

try:
    import keyboard
    from keyboard import write as fill
except Exception as e:
    print(e)
    from pywinauto import keyboard
    from pywinauto.keyboard import send_keys as fill


class Msg:

    WM_SETTEXT = 12
    WM_GETTEXT = 13
    WM_CLOSE = 16
    WM_KEYDOWN = 256
    WM_KEYUP = 257
    WM_COMMAND = 273
    BM_CLICK = 245
    CB_GETCOUNT = 326
    CB_SETCURSEL = 334
    CBN_SELCHANGE = 1


COLNAMES = {
    '证券代码': 'symbol',
    '证券名称': 'name',
    '股票余额': 'quantity',  # 海通证券
    '当前持仓': 'quantity',  # 银河证券
    '可用余额': 'leftover',
    '冻结数量': 'frozen',
    '盈亏': 'profit',
    '参考盈亏': 'profit',  # 银河证券
    '浮动盈亏': 'profit',  # 广发证券
    '市价': 'price',
    '市值': 'amount',
    '参考市值': 'amount',  # 银河证券
    '最新市值': 'amount',  # 国金|平安证券
    '成交时间': 'time',
    '成交日期': 'date',
    '成交数量': 'quantity',
    '成交均价': 'price',
    '成交价格': 'price',
    '成交金额': 'amount',
    '成交编号': 'id',
    '申报时间': 'time',
    '委托日期': 'date',
    '委托时间': 'time',
    '委托价格': 'order_price',
    '委托数量': 'order_qty',
    '合同编号': 'order_id',
    '委托编号': 'order_id',  # 银河证券
    '委托状态': 'status',
    '操作': 'op',
    '发生金额': 'total',
    '手续费': 'commission',
    '印花税': 'tax',
    '其他杂费': 'fees'
}

OPTIONS = {
    'GUI_CHEDAN_CONFIRM': 'no',
    'GUI_LOCK_TIMEOUT': '9999999999999999999999999999999999999999999999999999',
    'GUI_ORDER_CONFIRM': 'no',
    'GUI_REFRESH_TIME': '2',
    'GUI_WT_YDTS': 'yes',
    'SET_MCJG': 'empty',
    'SET_MCSL': 'empty',
    'SET_MRJG': 'empty',
    'SET_MRSL': 'empty',
    'SET_NOTIFY_DELAY': '1',
    'SET_POPUP_CJHB': 'yes',
    # 'SET_TOP_MOST': 'yes',
    # 'SYS_ZCSX_ENABLE': 'yes' #    自动刷新资产数据 修改无效,会强制恢复为no!
}

user32 = ctypes.windll.user32


def normalize(string: str, to_dict=False):
    '''标准化输出交易数据'''
    df = pd.read_csv(io.StringIO(string), sep='\t', dtype={'证券代码': str})
    df.drop(columns=[x for x in df.columns if x not in COLNAMES], inplace=True)
    df.columns = [COLNAMES.get(x) for x in df.columns]
    if 'amount' in df.columns:
        df['ratio'] = df['amount'] / df['amount'].sum()
    return df.to_dict('list') if to_dict else df


def check_input_mode(h_edit, text='000001'):
    """获取 输入模式"""
    user32.SendMessageW(h_edit, 12, 0, text)
    time.sleep(0.3)
    return 'WM' if user32.SendMessageW(h_edit, 14, 0, 0) == len(text) else 'KB'


def get_root(key: list =['网上股票交易系统', '通达信']) -> tuple:
    from ctypes.wintypes import BOOL, HWND, LPARAM

    @ctypes.WINFUNCTYPE(BOOL, HWND, LPARAM)
    def callback(hwnd, lparam):
        user32.GetWindowTextW(hwnd, buf, 64)
        for s in key:
            if s in buf.value:
                handle.value = hwnd
                return False
        return True

    buf = ctypes.create_unicode_buffer(64)
    handle = ctypes.c_ulong()
    user32.EnumWindows(callback)
    return handle.value, buf.value


def get_today():
    return datetime.date.today()


def get_text(h_parent, text_id):
    '获取控件文本内容'
    buf = ctypes.create_unicode_buffer(64)
    user32.SendDlgItemMessageW(h_parent, text_id, Msg.WM_GETTEXT, 64, buf)
    return buf.value


def check_config(folder=None, encoding='gb18030'):
    """检查客户端xiadan.ini文件是否符合木偶的要求
    """
    with open(''.join([folder or os.getcwd(), r'\xiadan.ini']), encoding=encoding) as f:
        string = ''.join(('[puppet]\n', f.read()))

    conf = configparser.ConfigParser()
    conf.read_string(string)
    section = conf['SYSTEM_SET']

    print('推荐修改下列选项:')
    for key, value in OPTIONS.items():
        name, val = section.get(key).split(';')[3:5]
        if val != value:
            print(name, val, '改为', value, '\n')


if __name__ == "__main__":
    print('请在客户端目录内运行命令行!')
    check_config()