import argparse
import json
import os.path
import platform
import re
import traceback
import winreg
import pytest

BASE_DIR = os.path.dirname(__file__)


def distribute_testcase(test_num):
    with open(os.path.join(BASE_DIR, 'testcases.json'), 'r', encoding='utf-8') as f:
        test_cases_list = [case.get('case_file') for case in json.load(f)]
    if test_num == '1/2':
        selected = test_cases_list[0:1] + test_cases_list[8:]
    elif test_num == '2/2':
        selected = test_cases_list[0:8]
    else:
        selected = test_cases_list
    return selected

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='manual to this scription')
    parser.add_argument('--test_num', type=str, default='1/1')
    parser.add_argument('--save_path', type=str, default='./report')
    parser.add_argument('--device_num', type=str, default='')
    args = parser.parse_args()

    test_num = args.test_num
    sn = args.device_num
    save_path = os.path.join(args.save_path, sn)

    print('[current dir]{}'.format(os.getcwd()))

    run_params = ['-vs', '--sn={}'.format(sn)]

    try:

        # 报告保存路径
        report = os.path.join(args.save_path, '{}_report.html'.format(sn))
        run_params.extend(['--html={}'.format(report), '--self-contained-html', '--capture=sys'])

        # 用例选择
        selected_cases = distribute_testcase(test_num)
        run_params.extend(selected_cases)

        print(run_params)
        pytest.main(run_params)

        system = platform.system().lower()
        if system.startswith('win'):
            #encoding = 'gbk'
            key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SYSTEM\CurrentControlSet\Control\Nls\CodePage")
            value, reg_type = winreg.QueryValueEx(key, "ACP")
            winreg.CloseKey(key)
            if "65001" == value:
                encoding = 'utf-8'
            else:
                encoding = 'gbk'
        else:
            encoding = 'utf-8'

        with open(report, 'r+', encoding=encoding) as f:
            text = f.read()
            passed = int(re.findall(r'<span class="passed">(\d+)\s*passed', text, re.I)[0])
            # if encoding == 'gbk':
            #     text = text.replace('<meta charset="utf-8"/>', '<meta charset="gbk"/>')
            #     f.seek(0)
            #     f.write(text)
        if passed == len(selected_cases):
            print('SmokeTest: End of check, test succeeded!')
        else:
            print('SmokeTest: End of check, SmokeTest find some fatal problems! passed {}/{}'.format(passed, len(selected_cases)))
    except:
        print('SmokeTest: End of check, SmokeTest find some fatal problems! {}'.format(traceback.format_exc()))