import pymssql
from datetime import datetime, timedelta

def connect_and_query(max_execute_counts,
                     db_host='localhost',
                     db_user='sa', 
                     db_password='password',
                     db_database='vat',
                     db_port=1433):
    connection = None
    try:
        # 获取当前日期信息
        current_date = datetime.now()
        current_day = current_date.day
        current_year_month_day = current_date.strftime('%Y%m%d')
        
        # 根据当前日期确定目标文件时间
        if current_day < 10:
            # 当前日 < 10号,目标为上上月
            target_file_date = (current_date.replace(day=1) - timedelta(days=32)).strftime('%Y%m')
        else:
            # 当前日 >= 10号,目标为上月  
            target_file_date = (current_date.replace(day=1) - timedelta(days=1)).strftime('%Y%m')
        
        # 计算5分钟前的时间
        five_minutes_ago = current_date - timedelta(minutes=5)
        
        print(f"当前日期: {current_date.strftime('%Y-%m-%d')}, 当前日: {current_day}")
        print(f"目标文件时间: {target_file_date}")
        print(f"当前年月日: {current_year_month_day}")
        print(f"5分钟前时间: {five_minutes_ago.strftime('%Y-%m-%d %H:%M:%S')}")
        
        # 连接 SQL Server 数据库
        connection = pymssql.connect(
            server=db_host,
            user=db_user,
            password=db_password,
            database=db_database,
            port=db_port,
            charset='utf8',
            as_dict=True
        )
        
        cursor = connection.cursor()
        
        # ===== 第一次查询 =====
        print("\n===== 执行第一次查询 =====")
        select_sql_1 = """
        SELECT TOP 1 *
        FROM cds_download
        WHERE last_file_date < %s
        AND (
            (last_execute_result IN(0,3) AND last_execute_counts < %s) 
            OR last_execute_year_month_day != %s
            OR last_execute_year_month_day IS NULL
        )
        -- 优先处理最久未执行的账号(ymd ASC), 同日时老账号优先(id ASC)
        -- 避免原先 id DESC 导致 id 小的老账号长期排队饥饿
        ORDER BY last_execute_year_month_day ASC, id ASC
        """

        # 参数值
        params_1 = (target_file_date, max_execute_counts, current_year_month_day)
        
        # 调试信息 - 显示完整SQL
        debug_sql_1 = select_sql_1.replace('%s', '{}').format(*[f"'{p}'" if isinstance(p, str) else str(p) for p in params_1])
        print("=== 第一次查询SQL ===")
        print(debug_sql_1)
        print("====================")
        
        # 执行第一次查询
        cursor.execute(select_sql_1, params_1)
        result = cursor.fetchone()
        
        # ===== 如果第一次查询没有结果,执行第二次查询 =====
        if not result:
            print("\n第一次查询未找到记录,执行第二次查询...")
            print("===== 执行第二次查询 =====")
            
            select_sql_2 = """
            SELECT TOP 1 *
            FROM cds_download
            WHERE last_execute_result = 1
            AND updated_time < %s
            ORDER BY id DESC
            """
            
            params_2 = (five_minutes_ago,)
            
            # 调试信息
            debug_sql_2 = select_sql_2.replace('%s', "'{}'").format(five_minutes_ago.strftime('%Y-%m-%d %H:%M:%S'))
            print("=== 第二次查询SQL ===")
            print(debug_sql_2)
            print("====================")
            
            # 执行第二次查询
            cursor.execute(select_sql_2, params_2)
            result = cursor.fetchone()
            
            if result:
                print(f"第二次查询找到超时执行中的记录: ID={result['id']}")
            else:
                print("第二次查询也未找到符合条件的记录")
        
        # ===== 处理查询结果 =====
        if result:
            # 处理datetime字段格式化
            for key in result:
                if isinstance(result[key], datetime):
                    result[key] = result[key].isoformat()
            
            print(f"\n查询到记录: ID={result['id']}, 账号别名={result['account_alias']}")
            print(f"最新文件时间: {result.get('last_file_date')}")
            print(f"最新执行时间: {result.get('last_execute_year_month_day')}")
            print(f"当前执行次数: {result.get('last_execute_counts', 0)}")
            print(f"当前执行结果: {result.get('last_execute_result')}")
            print(f"更新时间: {result.get('updated_time')}")
            
            # 根据业务逻辑更新数据
            record_id = result['id']
            record_execute_date = result.get('last_execute_year_month_day')
            current_counts = result.get('last_execute_counts', 0) or 0
            
            if record_execute_date != current_year_month_day:
                # 3.1 最新执行时间 != 当前年月日
                # 最新执行时间 = 当前年月日 and 执行结果 = 执行中 and 执行次数 = 1
                update_sql = """
                UPDATE cds_download 
                SET last_execute_year_month_day = %s,
                    last_execute_result = 1,
                    last_execute_counts = 1,
                    last_execute_fail_reason = '',
                    updated_time = GETDATE()
                WHERE id = %s
                """
                update_params = (current_year_month_day, record_id)
                print(f"\n=== 更新SQL (新执行日期) ===")
                debug_update_sql = update_sql.replace('%s', '{}').format(*[f"'{p}'" if isinstance(p, str) else str(p) for p in update_params])
                print(debug_update_sql)
                cursor.execute(update_sql, update_params)
                print(f"更新记录: 设置新执行日期为 {current_year_month_day}, 执行次数重置为1")
                
            else:
                # 3.2 最新执行时间 = 当前年月日  
                # 执行结果 = 执行中 and 执行次数 = 原执行次数 + 1
                new_counts = current_counts + 1
                update_sql = """
                UPDATE cds_download 
                SET last_execute_result = 1,
                    last_execute_counts = %s,
                    updated_time = GETDATE()
                WHERE id = %s
                """
                update_params = (new_counts, record_id)
                print(f"\n=== 更新SQL (相同执行日期) ===")
                debug_update_sql = update_sql.replace('%s', '{}').format(*update_params)
                print(debug_update_sql)
                cursor.execute(update_sql, update_params)
                print(f"更新记录: 执行次数从 {current_counts} 增加到 {new_counts}")
            
            # 提交事务
            connection.commit()
            print(f"\n成功更新记录ID: {record_id}")
            
        else:
            print("\n两次查询均未找到符合条件的记录")
            print(f"第一次查询条件: 文件时间 < {target_file_date}, 最大执行次数 < {max_execute_counts}")
            print(f"第二次查询条件: 执行结果 = 1(执行中), 更新时间 < {five_minutes_ago.strftime('%Y-%m-%d %H:%M:%S')}")
        
        cursor.close()
        return result
        
    except pymssql.Error as e:
        print(f"连接或查询数据库时出错: {e}")
        if connection:
            connection.rollback()
        return None
    except Exception as e:
        print(f"处理过程中出错: {e}")
        if connection:
            connection.rollback()
        return None
    finally:
        # 关闭连接
        if connection:
            connection.close()






