from wechat_action.login_ad import LogIn
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver import ChromeOptions
import time
import random
import re


class CreateAd:
    def __init__(self):
        # TODO:创建完页面需要关闭所有页面并回到一开始的页面
        self.driver = LogIn().get_driver_loged()
        self.get_into_create_page()
        self.send_file_limit_num = 8

    def get_into_create_page(self):
        # 进入创建页面
        self.driver.find_element_by_id('material').click()
        WebDriverWait(self.driver, 10).until(lambda driver: driver.find_element_by_class_name('ui-fl-r'))
        time.sleep(random.uniform(0.1, 0.2))
        self.driver.find_element_by_class_name('ui-fl-r').click()
        WebDriverWait(self.driver, 5).until(lambda driver: driver.find_element_by_css_selector(
            '#wxadcontainer > div:nth-child(1) > div:nth-child(2) > div.dialog-1fj_N480ZT > div > div > div:nth-child(1) > div.dialogCardFooter-17KpBD1lgN > button'))
        self.driver.find_element_by_css_selector(
            '#wxadcontainer > div:nth-child(1) > div:nth-child(2) > div.dialog-1fj_N480ZT > div > div > div:nth-child(1) > div.dialogCardFooter-17KpBD1lgN > button').click()
        self.driver.switch_to.window(self.driver.window_handles[-1])
        WebDriverWait(self.driver, 100).until(lambda driver: driver.find_element_by_class_name('addContent-8pexaaAGYy'))
        self.driver.find_element_by_class_name('addContent-8pexaaAGYy').click()
        WebDriverWait(self.driver, 100).until(lambda driver: driver.find_element_by_class_name('topArea-qOwEAeNuIn'))

    def create_layout(self):
        # 创建编排
        pass

    def set_head_assemb(self, info):
        def single_page_set():
            pass

        def multi_page_set():
            self.driver.find_element_by_css_selector(
                '#stage-sidebar > div.topArea-qOwEAeNuIn > div > div:nth-child(2)').click()
            time.sleep(random.uniform(0.1, 0.2))
            page_size = len(info_v)
            if page_size == 3:
                pass
            if page_size == 4:
                self.driver.find_element_by_css_selector(
                    '#stage-settings > div:nth-child(1) > div > div > div:nth-child(3) > div.adui-form-item > div.adui-form-control > div > button:nth-child(2)').click()

            if page_size == 6:
                self.driver.find_element_by_css_selector(
                    '#stage-settings > div:nth-child(1) > div > div > div:nth-child(3) > div.adui-form-item > div.adui-form-control > div > button:nth-child(3)').click()

            time.sleep(random.uniform(0.1, 0.2))
            self.driver.find_element_by_class_name('imageUploadItem-tA9JX0RWua').click()
            WebDriverWait(self.driver, 1000).until(
                lambda driver: self.driver.find_element_by_class_name('adui-tabs-tab')
            )
            input_elements = self.driver.find_elements_by_tag_name('input')
            input_find_element = None
            for _ in input_elements:
                if '输入关键词搜索素材' in _.get_attribute('placeholder'):
                    input_find_element = _
            from selenium.webdriver.common.keys import Keys

            for _ in info_v:
                import os
                file_name = os.path.basename(_)
                print(file_name)
                input_find_element.clear()
                print('clear')
                print(input_find_element.get_attribute('value'))
                time.sleep(5)

                #TODO:input----clear 进行清空有问题

                input_find_element.send_keys(file_name)
                input_find_element.send_keys(Keys.RETURN)
                WebDriverWait(self.driver, 1000).until(
                    lambda driver: driver.find_element_by_class_name('imgWrp-3KLtxlD1Db'))
                file_element = self.driver.find_element_by_class_name('imgWrp-3KLtxlD1Db')
                WebDriverWait(self.driver, 1000).until(
                    lambda x: (file_element.is_displayed() and file_element.is_enabled()))

                file_element.click()
                time.sleep(random.uniform(1,4))

            time.sleep(1000)
            self.driver.find_elements_by_class_name('adui-tabs-tab')[1].click()
            for i in range(len(info_v)):
                self.driver.find_element_by_xpath("//div[starts-with(@id,'js_multi_upload_material')]/input").send_keys(
                    info_v[i])

        info_key = list(info.keys())[0]
        info_v = info[info_key]

        if info_key == 'page':
            single_page_set()
        if info_key == 'multi_page':
            multi_page_set()
        # 设置头部组件
        pass

    def set_page(self):
        # 设置图片模块
        pass

    def set_title(self):
        # 设置标题模块
        pass

    def set_content(self):
        # 输入文本内容
        pass

    def set_follow_button(self):
        # 设置关注按钮
        pass

    def set_set_text_button(self):
        # 设置图文按钮
        pass

    def send_file_multi(self, layout, err_num=0):
        # 上传文件,文件上传与整体流程切割开
        token = re.findall('token=(\d+)', self.driver.current_url)
        url_ = 'https://mp.weixin.qq.com/promotion/frame?t=ad_system/common_frame&t1=material_std/material_library&token={}'.format(
            token[0])
        js = "window.open('{}')".format(url_)
        print(js)
        self.driver.execute_script(js)
        time.sleep(random.uniform(1, 2))
        self.driver.switch_to.window(self.driver.window_handles[-1])
        file_set = set()
        for v in layout.values():
            if isinstance(v, dict):
                if 'multi_page' in v.keys() or 'page' in v.keys() or 'movie' in v.keys():
                    v_name = list(v.keys())[0]
                    if isinstance(v[v_name], list):
                        for _ in v[v_name]:
                            file_set.add(_)
                    else:
                        file_set.add(v[v_name])
        file_list = list(file_set)
        print(file_list)
        print('file list size', len(file_list))
        send_file_sign = self.send_file_limit_num
        for _ in file_list:
            print(_)
            self.driver.find_element_by_xpath('//*[@id="wxadcontainer"]/div[1]/div[2]/div[4]/input').send_keys(_)

        time.sleep(100)
        while True:
            # 失败,失败直接退出重跑
            # 正在上传数量,如果是正在上传小于限定数量,就不断输入
            # 上传完毕,小于限定数量,不断输入,.....已经上传好了,就关闭
            time.sleep(1)
            send_reslut_content = self.driver.find_element_by_xpath(
                '//*[@id="wxadcontainer"]/div[1]/div[2]/div[4]/div/strong').text
            if '失败' in send_reslut_content:
                if err_num < 3:
                    self.send_file(layout, err_num=err_num + 1)
                else:
                    exit()
            if '正在上传' in send_reslut_content:
                if send_file_sign < len(file_list):
                    send_num = re.findall('(\d+)', send_reslut_content)[0]
                    if int(send_num) < self.send_file_limit_num:
                        # 还可以继续上传
                        x = send_file_sign
                        can_send_sign = send_file_sign + (self.send_file_limit_num - send_num)
                        y = can_send_sign if can_send_sign < len(file_list) else len(file_list)
                        for i in range(x, y):
                            send_file_sign = send_file_sign + 1
                            self.driver.find_element_by_xpath(
                                '//*[@id="wxadcontainer"]/div[1]/div[2]/div[4]/input').send_keys(file_list[i])

                else:
                    pass
            if '上传成功' in send_reslut_content:
                if send_file_sign < len(file_list):
                    send_num = re.findall('(\d+)', send_reslut_content)[0]
                    if int(send_num) < self.send_file_limit_num:
                        # 还可以继续上传
                        x = send_file_sign
                        can_send_sign = send_file_sign + (self.send_file_limit_num - send_num)
                        y = can_send_sign if can_send_sign < len(file_list) else len(file_list)
                        for i in range(x, y):
                            send_file_sign = send_file_sign + 1
                            self.driver.find_element_by_xpath(
                                '//*[@id="wxadcontainer"]/div[1]/div[2]/div[4]/input').send_keys(file_list[i])
                else:
                    break

        time.sleep(1000)
        self.driver.execute_script('window.close();')

    def send_file(self, file_path, err_num=0):
        self.driver.execute_script('location.reload();')
        self.driver.find_element_by_xpath('//*[@id="wxadcontainer"]/div[1]/div[2]/div[4]/input').send_keys(file_path)

    def send_file_alone(self, layout):
        # 上传文件,单线程
        # 上传文件,文件上传与整体流程切割开
        token = re.findall('token=(\d+)', self.driver.current_url)
        url_ = 'https://mp.weixin.qq.com/promotion/frame?t=ad_system/common_frame&t1=material_std/material_library&token={}'.format(
            token[0])
        js = "window.open('{}')".format(url_)
        self.driver.execute_script(js)
        time.sleep(random.uniform(1, 2))
        self.driver.switch_to.window(self.driver.window_handles[-1])
        file_set = set()
        for v in layout.values():
            if isinstance(v, dict):
                if 'multi_page' in v.keys() or 'page' in v.keys() or 'movie' in v.keys():
                    v_name = list(v.keys())[0]
                    if isinstance(v[v_name], list):
                        for _ in v[v_name]:
                            file_set.add(_)
                    else:
                        file_set.add(v[v_name])
        for _ in file_set:
            self.send_file(_)
            err_num = 0
            while True:
                time.sleep(1)
                send_reslut_content = self.driver.find_element_by_xpath(
                    '//*[@id="wxadcontainer"]/div[1]/div[2]/div[4]/div/strong').text
                if '上传成功' in send_reslut_content:
                    break
                if '失败' in send_reslut_content:
                    err_num = err_num + 1
                    self.send_file(_)
                    if err_num > 3:
                        # TODO:退出机制需要考虑一下,tornado返回错误信息
                        exit()

        self.driver.execute_script('window.close();')
        self.driver.switch_to.window(self.driver.window_handles[-1])

    def send_moive_spic(self):
        # 特殊情况下,上传本地视频
        pass

    def get_layout(self):
        # 得到编排

        layout = {-1: {'page': '/usr/share/wallpapers/deepin/Beach_by_Samuel_Scrimshaw.jpg'},
                  0: {'title': '这是标题'},
                  1: {'content': '这是文本'},
                  2: 'follow_button-1',
                  3: {'title': '这是标题'},
                  4: {'content': '这是文本'},
                  5: {'page': '/usr/share/wallpapers/deepin/Beach_by_Samuel_Scrimshaw.jpg'},
                  6: {'page': '/usr/share/wallpapers/deepin/Beach_by_Samuel_Scrimshaw.jpg'},
                  7: 'follow_button-2',
                  8: 'follow_button-3',
                  }
        # TODO:测试,多图,测试,图文表
        layout = {-1: {'multi_page': ['/usr/share/wallpapers/deepin/Beach_by_Samuel_Scrimshaw.jpg',
                                      '/usr/share/wallpapers/deepin/Sunset_of_the_Lake_Nam_by_Wang_Jinyu.jpg',
                                      '/usr/share/wallpapers/deepin/The_Gongga_Mountain_by_wangjinyu.jpg',
                                      '/usr/share/wallpapers/deepin/Reflection_of_the_Kanas_Lake_by_Wang_Jinyu.jpg']},
                  0: {'page': '/usr/share/wallpapers/deepin/Beach_by_Samuel_Scrimshaw.jpg'}
                  }

        # self.send_file_alone(layout)
        self.set_head_assemb(layout[-1])
        for _ in range(max(layout.keys())):
            pass
        time.sleep(100)


if __name__ == '__main__':
    create_ad = CreateAd()
    create_ad.get_layout()