import threading
import time

from model.global_manager import GM
from model.helper import MyHelper
from net.task_api import task_api
from tools.log import logger


class Task:
    _lock = threading.Lock()

    def __init__(self, helper: MyHelper):
        self.helper = helper
        self.error_count = 0

    def run(self):
        try:
            logger.info(f"[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]任务开始",self.helper.window_id)

            for _ in range(1):

                logger.info(f"[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]模拟器还原",self.helper.window_id)

                # 模拟器还原、改机、切换地区、启动加锁，主要避免还原和启动时的高硬盘读写以及切换Ip地区时刷新节点的频率
                with self._lock:
                    result, message = self.helper.restore_emulator()

                if not result:
                    logger.exception(f"[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]模拟器还原失败，错误信息：{message}")
                    break
                logger.info(f"[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]模拟器还原成功",self.helper.window_id)
                time.sleep(1)

                #改机
                logger.info(f"[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]模拟器改机",self.helper.window_id)
                result, message = self.helper.modify_emulator()
                if not result:
                    logger.exception(f"[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]模拟器改机失败，错误信息：{message}")
                    break
                logger.info(f"[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]模拟器改机成功",self.helper.window_id)
                time.sleep(1)

                #切换地区
                if GM.device_info.use_wuyouip == '1':
                    logger.info(f"[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]模拟器切换地区",self.helper.window_id)
                    result, message = self.helper.switch_emulator_area()
                    if not result:
                        logger.error(f"[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]切换模拟器地区失败，错误信息：{message}")
                        break
                    logger.info(f"[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]模拟器地区切换成功",self.helper.window_id)
                    time.sleep(1)

                #启动
                logger.info(f"[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]模拟器启动",self.helper.window_id)
                with self._lock:
                    result, message = self.helper.start_emulator_and_set_position()

                if not result:
                    logger.error(f"[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]模拟器启动失败，错误信息：{message}")
                    up_log_profession = task_api.up_log_profession(self.helper.account_info.account, self.helper.game_config.task_id, '启动模拟器', '失败')
                    logger.info(f"[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]上报关键日志-{up_log_profession}",self.helper.window_id)
                    self.helper.upload_device_log(status=0)
                    break
                logger.info(f"[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]模拟器启动成功",self.helper.window_id)
                up_log_profession = task_api.up_log_profession(self.helper.account_info.account, self.helper.game_config.task_id,'启动模拟器', '成功')
                logger.info(f"[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]上报关键日志-{up_log_profession}",self.helper.window_id)
                self.helper.upload_device_log(status=1)
                time.sleep(1)

                #上报设备信息
                logger.info(f"[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]上报设备信息：{self.helper.upload_log.upload_log.to_dict()}",self.helper.window_id)
                    # time.sleep(10)
                    #
                    # result, message = self.helper.confirm_emulator_area()
                    # if not result:
                    #     logger.error(f"[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]确认模拟器地区错误，错误信息：{message}")
                    #     break
                time.sleep(1)

                #大漠绑定
                logger.info(f"[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]执行脚本-大漠绑定",self.helper.window_id)
                result, message = self.helper.bind_emulator()
                if not result or message != 1:
                    logger.exception(f'[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]执行脚本"大漠绑定"失败,返回：{message}')
                    break
                logger.info(f'[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]执行脚本-大漠绑定-成功,返回：{message}',self.helper.window_id)
                time.sleep(1)

                #启动游戏
                logger.info(f'[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]执行脚本-启动游戏',self.helper.window_id)
                result, message = self.helper.start_game()
                if not result or message != 1:
                    self.helper.upload_log.upload_start_game_log(status=0)
                    logger.exception(f'[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]执行脚本-启动游戏-失败，错误信息：{message}')
                    break
                self.helper.upload_log.upload_start_game_log(status=1)
                logger.info(f'[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]执行脚本-启动游戏-成功,返回：{message}',self.helper.window_id)
                time.sleep(1)

                #登录游戏
                logger.info(f'[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]执行脚本-登录游戏',self.helper.window_id)
                result, message = self.helper.login_game()
                if not result or message != 1:
                    logger.exception(f'[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]执行脚本-登录游戏-失败,错误信息：{message}')
                    self.helper.upload_log.upload_longin_log(status=0)
                    break
                logger.info(f'[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]执行脚本-登录游戏-成功，返回：{message}',self.helper.window_id)
                self.helper.upload_log.upload_longin_log(status=1)
                time.sleep(1)

                #执行主线任务
                logger.info(f'[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]执行脚本-教程主线',self.helper.window_id)
                result, message = self.helper.main_task()
                if not result:
                    self.helper.upload_log.upload_main_log(status=0)
                    logger.exception(f'[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]执行脚本-教程主线-失败，错误信息：{message}')
                    break
                self.helper.upload_log.upload_main_log(status=1)
                logger.info(f"[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]执行脚本-教程主线-成功,返回：{message}",self.helper.window_id)

                #上报新增留存状态
                if self.helper.account_info.retained == 0:
                    result = task_api.up_log_profession(self.helper.account_info.account, self.helper.game_config.task_id,
                                                  '教程主线', '新增成功')
                    logger.info(f"[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]上报账号-新增成功：{result}",self.helper.window_id)

                else:
                    result = task_api.up_log_profession(self.helper.account_info.account, self.helper.game_config.task_id,
                                                  '教程主线', '留存成功')
                    logger.info(f"[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]上报账号-留存成功：{result}",self.helper.window_id)

        except Exception as e:
            logger.exception(f"[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]任务异常：{e}",self.helper.window_id)
        finally:
            time.sleep(1)
            logger.info(f"[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]关闭模拟器",
                        self.helper.window_id)
            self.helper.close_emulator_and_confirm()
            logger.info(f"[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]模拟器已关闭",
                        self.helper.window_id)
            GM.set_emulator_status(f'{self.helper.emulator_type}-{self.helper.emulator_index}', 0)
            GM.set_window_status(self.helper.window_id, 0)
            logger.info(f"[窗口-{self.helper.window_id}][模拟器-{self.helper.emulator_index}]任务结束",
                        self.helper.window_id)
            time.sleep(3)