import sys
import os
from datetime import datetime, timedelta

sys.path.append(os.path.dirname(sys.path[0]))  # 上级目录
from multiprocessing import Pool
from amazon_spider.search_term_pg import search_temp_pg
from threading_spider.db_connectivity import connect_db
import time
import pandas as pd
import random
from amazon_spider.VPS_IP import pppoe_ip
from threading_spider.post_to_dolphin import DolphinschedulerHelper


def select_search_term_state(engine_pg, month, site):
    for i in range(5):
        try:
            sql_read = f"SELECT id FROM {site}_search_term_month_syn where state in (1,2) and date_info='2025-{month}' LIMIT 1"
            print(sql_read)
            df = pd.read_sql(sql_read, con=engine_pg)
            id_tuple = list(df.id)
            if id_tuple:
                id_tuple = [1]
            else:
                id_tuple = None
            return id_tuple
        except:
            db_class = connect_db(site)
            engine_pg = db_class.pg_db()  # pg

        return 1


def select_sate_mysql(site, num=None, month=None, week=None):
    db_class = connect_db(site)
    engine_pg = db_class.pg_db()  # pg
    cursor_us, connect_us = db_class.us_mysql_db()  # us站点
    print('month::', month)
    if num == 1:
        sql_select_ = f"select status_val from workflow_progress where date_info='2025-{week}' and date_type='week' and page='反查搜索词' and site_name='{site}'"
        print(sql_select_)
        cursor_us.execute(sql_select_)
        # 获取结果
        status_dict = cursor_us.fetchone()
        print(status_dict)
        if int(status_dict[0]) in (1, 2):
            update_workflow_progress = f"update workflow_progress set status_val=3,status='抓取结束' where page='反查搜索词' and date_info='2025-{week}' and site_name='{site}' and date_type='week'"
            print('update_workflow_progress: 修改状态3 ', update_workflow_progress)
            cursor_us.execute(update_workflow_progress)
            connect_us.commit()
            account = 'pengyanbing'
            title = site + '站点 搜索词'
            content = f'{month} 月 搜索词 已结束,请确认下一步流程!时间:'
            db_class.send_mg(account, title, content)
            ii = 0
            for i in range(11):
                id_tuple = select_search_term_state(engine_pg, month, site)
                time.sleep(180)
                if id_tuple is None:
                    ii += 1
                    if ii > 8:
                        break
            if id_tuple is None:
                DolphinschedulerHelper.start_process_instance_common(
                    project_name="big_data_selection",
                    process_df_name='ALL站点-asin同步-pg-api',
                    startParams={
                        "site_name": f"{site}",
                        "date_type": "month",
                        "date_info": f'2025-{month}'
                    }
                )
                account = 'pengyanbing,chenyuanjie,hezhe,wangrui4,fangxingjun,chenjianyun,zhouyuchen'
                title = site + '站点 搜索词'
                content = f'{month} 月 搜索词 已结束,成功调度 ALL站点-asin同步-pg-api'
                db_class.send_mg(account, title, content)
                return True
        else:
            print('5555555555555555555555555555555555')
            return False

    if num == 3:
        # 搜索词多进程已经抓完。最后执行单进程抓取。
        id_tuple = select_search_term_state(engine_pg, month, site)
        if id_tuple is None:
            select_sate_mysql(site, num=1, month=month, week=week)
            return False
        else:
            return True


def long_time_task(site, proxy_name, month):
    print("当前 抓取 站点 ", site)
    spider_us = search_temp_pg(site_name=site, read_size=300, proxy_name=proxy_name, month=month)
    spider_us.run_pol()


if __name__ == '__main__':
    pppoe_ip()
    site_list = ['us','de','uk']
    month = int(sys.argv[1])
    week = int(sys.argv[2])
    proxy_name = None
    if month < 10:
        month = '0' + str(month)
    if week < 10:
        week = '0' + str(week)
    print(month, week)
    for site in site_list:
        while True:
            current_time = datetime.now()
            # 计算后五分钟的时间
            five_minutes_later = current_time + timedelta(minutes=1)
            print('后五分钟时间', five_minutes_later)
            p = Pool(3)
            for i in range(3):
                p.apply_async(long_time_task, args=(site, proxy_name, month))
            print('等待所有子进程运行完成')
            # 执行该方法后不能继续添加新的Process
            p.close()
            # 等待所有子进程执行完毕
            p.join()
            print('所有进程运行完毕！')
            print('所有进程运行完毕！开始切换ip')
            print('所有进程运行完毕！开始切换ip')
            print('所有进程运行完毕！开始切换ip')
            print('所有进程运行完毕！开始切换ip')
            current_time = datetime.now()
            if current_time > five_minutes_later:
                pppoe_ip()
            else:
                time.sleep(random.uniform(150, 220))
                pppoe_ip()
            if select_sate_mysql(site, num=3, month=month, week=week) == False:
                break
