import random
import threading
import time
from enum import Enum
import wda
import os
from Utils.AiUtils import AiUtils
from Utils.ControlUtils import ControlUtils
from Utils.LogManager import LogManager
from Entity.Variables import anchorList, removeModelFromAnchorList, prologueList
from Utils.Requester import Requester


# 脚本管理类
class ScriptManager():

    # 单利对象
    _instance = None  # 类变量，用于存储单例实例

    def __new__(cls):
        # 如果实例不存在，则创建一个新实例
        if cls._instance is None:
            cls._instance = super(ScriptManager, cls).__new__(cls)
        # 返回已存在的实例
        return cls._instance

    def __init__(self):
        super().__init__()
        self.initialized = True  # 标记已初始化

    # 养号
    def growAccount(self, udid, event):
        client = wda.USBClient(udid)
        session = client.session()
        session.appium_settings({"snapshotMaxDepth": 0})

        # 先关闭Tik Tok
        ControlUtils.closeTikTok(session, udid)
        time.sleep(1)

        # 重新打开Tik Tok
        ControlUtils.openTikTok(session, udid)
        time.sleep(3)

        # 创建udid名称的目录
        AiUtils.makeUdidDir(udid)

        # 假设此时有个开关
        while not event.is_set():
            try:
                img = client.screenshot()
                filePath = f"resources/{udid}/bgv.png"
                img.save(filePath)
                LogManager.info("保存屏幕图像成功", udid)
                print("保存了背景图")
                time.sleep(1)
            except Exception as e:
                LogManager.error(e, udid)
                print(e)

            try:
                # 判断视频类型
                addX, addY = AiUtils.findImageInScreen("add", udid)
                # 多次获取结果是否一致，如果有不一致的结果就切换视频
                isSame = False
                for i in range(2):
                    tx, ty = AiUtils.findImageInScreen("add", udid)
                    if addX == tx and addY == ty:
                        isSame = True
                        time.sleep(1)
                    else:
                        isSame = False
                        break

                # 如果找到普通视频
                if addX > 0 and isSame:
                    needLike = random.randint(0, 10)
                    # 查找首页按钮
                    homeButton = AiUtils.findHomeButton(udid)
                    if homeButton:
                        print("有首页按钮，查看视频")
                        videoTime = random.randint(5, 15)
                        time.sleep(videoTime)

                        # 百分之三的概率点赞
                        if needLike < 3:
                            print("点赞")
                            ControlUtils.clickLike(session, udid)

                        print("继续观看视频")
                        videoTime = random.randint(10, 30)
                        time.sleep(videoTime)
                        print("准备划到下一个视频")
                        client.swipe_up()
                    else:
                        print("找不到首页按钮。出错了")
                else:
                    nextTime = random.randint(1, 5)
                    time.sleep(nextTime)
                    client.swipe_up()
            except Exception as e:
                print(f"发生异常：{e}")
                client.swipe_up()


    # 观看直播
    def watchLiveForGrowth(self, udid, event):
        client = wda.USBClient(udid)
        session = client.session()

        session.appium_settings({"snapshotMaxDepth": 15})
        # 先关闭Tik Tok
        ControlUtils.closeTikTok(session, udid)
        time.sleep(1)

        # 重新打开Tik Tok
        ControlUtils.openTikTok(session, udid)
        time.sleep(3)
        # 进入直播
        live_button = session(xpath='//XCUIElementTypeButton[@name="直播"]')
        if live_button.exists:
            live_button.click()
        time.sleep(20)

        size = session.window_size()
        width, height = size.width, size.height
        print(f"屏幕的宽高是：{width},{height}")

        # 可选：重新拉起 session，规避偶发 Stale 会话
        session = client.session()
        # session.appium_settings({"snapshotMaxDepth": 25})

        while not event.is_set():
            try:
                time.sleep(3)

                # 如果处于 PK（分数条），直接划走
                if session(xpath='//XCUIElementTypeOther[@name="kGBLInteractionViewMatchScoreBar"]').exists:
                    print("✅ 当前是 PK，跳过")
                    session.swipe_up()
                    continue

                # 数直播显示区域窗口（主画面 + 连麦小窗）
                count = AiUtils.count_add_by_xml(session)
                print(f"检测到直播显示区域窗口数：{count}")

                if count > 1:
                    print("❌ 多窗口（有人连麦/分屏），划走")
                    session.swipe_up()
                    continue
                else:
                    print("✅ 单窗口（只有一个主播），(目前是20%概率)开始点赞")

                # 点赞（仍保留中途转PK的保护）
                if random.random() >= 0.89:
                    print("开始点赞")
                    for _ in range(random.randint(10, 30)):
                        if session(xpath='//XCUIElementTypeOther[@name="kGBLInteractionViewMatchScoreBar"]').exists:
                            print("❗ 中途开始 PK，停止点赞并跳过")
                            session.swipe_up()
                            break
                        x = width // 3 + random.randint(-10, 10)
                        y = height // 3 + random.randint(10, 20)
                        print("双击坐标：", x, y)
                        session.double_tap(x, y)

                print("--------------------------------------------")
                time.sleep(random.randint(100, 300))
                session.swipe_up()

            except Exception as e:
                print("循环异常，重试：", repr(e))
                # 轻量恢复：重新获取 session，避免因为快照或元素句柄失效卡死
                try:
                    session = client.session()
                except Exception:
                    time.sleep(2)
                    session = client.session()



    # 关注打招呼以及回复主播消息
    def greetNewFollowers(self, udid, needReply, event):
        client = wda.USBClient(udid)
        session = client.session()

        # 先关闭Tik Tok
        ControlUtils.closeTikTok(session, udid)
        time.sleep(1)

        # 重新打开Tik Tok
        ControlUtils.openTikTok(session, udid)
        time.sleep(3)

        # 设置查找深度
        session.appium_settings({"snapshotMaxDepth": 15})
        # 点击搜索按钮
        ControlUtils.clickSearch(session)
        # 查找输入框
        input = session.xpath('//XCUIElementTypeSearchField')
        # 如果找到了输入框，就点击并且输入内容
        input.click()
        # 稍作停顿
        time.sleep(1)

        # 返回上一步
        def goBack():
            # ControlUtils.clickBack(session)
            client.swipe(5,120, 50, 120)

            # 删除数据
            removeModelFromAnchorList(anchor)


        # 循环条件。1、 循环关闭  2、 数据处理完毕
        while not event.is_set() or len(anchorList) > 0:

            # 获取一个主播
            anchor = anchorList[0]
            aid = anchor.anchorId
            anchorCountry = anchor.country

            input.clear_text()
            time.sleep(2)
            # 输入主播id
            input.set_text(aid + "\n")

            # 切换UI查找深度
            session.appium_settings({"snapshotMaxDepth": 25})

            # 定位 "关注" 按钮 通过关注按钮的位置点击主播首页
            follow_button = session.xpath(
                '//XCUIElementTypeCell[@index="1"]//XCUIElementTypeButton[@index="1"]').get()
            if follow_button:
                print("找到关注按钮！")
                x = follow_button.bounds.x - 200
                y = follow_button.bounds.y
                client.click(x, y)
            else:
                print("未找到关注按钮")

            time.sleep(3)

            # 找到并点击第一个视频
            cellClickResult = ControlUtils.clickFirstVideoFromDetailPage(session)

            # 观看主播视频
            def viewAnchorVideo():
                print("开始查看视频")
                count = 2
                while count > 0:
                    print("条件满足，继续查看")
                    img = client.screenshot()
                    time.sleep(1)
                    filePath = f"resources/{udid}/bgv.png"
                    img.save(filePath)
                    LogManager.info("保存屏幕图像成功", udid)
                    print("保存了背景图")
                    time.sleep(1)
                    addX, addY = AiUtils.findImageInScreen("add", udid)
                    if addX != -1:
                        r = ControlUtils.clickLike(session, udid)
                        # 如果点了赞，总数量-1 否则划下一个视频，无法点赞的原因很多。指不定是什么原因。所以直接下一个视频比较好
                        if r:
                            count -= 1
                        else:
                            client.swipe_up()
                    else:
                        client.swipe_up()
                        continue

                    # 假装看几秒视频
                    time.sleep(10)
                    client.swipe_up()
                    if count == 1:
                        client.swipe_right()
                        break

            # 点击第一个视频后的逻辑
            if cellClickResult:
                print("点击了视频")
                session.appium_settings({"snapshotMaxDepth": 5})
                print("重新设置了匹配深度")
                viewAnchorVideo()
                time.sleep(2)
                print("视频看完了")
                session.appium_settings({"snapshotMaxDepth": 25})
                # 视频看完需要点关注。
                r = ControlUtils.clickFollowButton(session)
                if r == False:
                    print("执行失败了")



                time.sleep(2)
                ControlUtils.clickFollowButton(session)
                time.sleep(2)

                # 查找聊天界面中的输入框节点
                chatInput = session.xpath("//*[className='XCUIElementTypeTextView']")
                if chatInput.exists:
                    print("找到了")
                    # 准备发送一条信息
                    chatInput.click()
                    time.sleep(2)
                    # text = random.choice(prologueList)
                    # msg = Requester.translation(text, anchorCountry)
                    chatInput.set_text("哈哈哈" + "\n")
                    time.sleep(1)

                    client.swipe_right()
                    time.sleep(1)
                    client.swipe_right()
                    time.sleep(2)
                else:
                    print("没找到")
                    client.swipe_right()
                    time.sleep(1)
                    client.swipe_right()
                    time.sleep(2)
                    break

                # 清除数据
                removeModelFromAnchorList(anchor)
                # 流程结束
                # client.swipe_right()
                # time.sleep(1)
            else:
                print("获取该主播第一个视频失败")
                goBack()



    def test(self, udid):
        client = wda.USBClient(udid)
        client.swipe_right()


manager = ScriptManager()
manager.test("eca000fcb6f55d7ed9b4c524055214c26a7de7aa")
# manager.growAccount("eca000fcb6f55d7ed9b4c524055214c26a7de7aa")

