"""
@author: luojunhui
"""
from tqdm import tqdm
from pymysql.cursors import DictCursor

from applications.api import fetch_deepseek_response
from applications import longArticlesMySQL

lam = longArticlesMySQL()


def generate_prompt(article_title):
    """
    generate prompt
    """
    prompt = f"""
        输入标题： {article_title}
        请将以上标题改写成适合小程序点击和传播的小程序标题，小程序标题的写作规范如下，请学习后进行小程序标题的编写。直接输出最终的小程序标题
        小程序标题写作规范：
        1.要点前置：将最重要的信息放在标题的最前面，以快速吸引读者的注意力。例如，“5月一辈子同学，三辈子亲，送给我的老同学，听哭无数人！”中的“5月”和“一辈子同学，三辈子亲”都是重要的信息点。
        2.激发情绪：使用能够触动人心的语言，激发读者的情感共鸣。如“只剩两人同学聚会，看后感动落泪。”使用“感动落泪”激发读者的同情和怀旧情绪。
        3.使用数字和特殊符号：数字可以提供具体性，而特殊符号如“🔴”、“😄”、“🔥”等可以吸引视觉注意力，增加点击率。
        4.悬念和好奇心：创建悬念或提出问题，激发读者的好奇心。
        5.名人效应：如果内容与知名人士相关，提及他们的名字可以增加标题的吸引力。
        6.社会价值观：触及读者的文化和社会价值观，如家庭、友情、国家荣誉等。
        7.标点符号的运用：使用感叹号、问号等标点来增强语气和情感表达。
        8.直接的语言：使用直白、口语化的语言，易于理解，如“狗屁股，笑死我了!”。
        9.热点人物或事件：提及当前的热点人物或事件，利用热点效应吸引读者。
        10.字数适中：保持标题在10-20个字之间，既不过长也不过短，确保信息的完整性和吸引力。
        11.情感或价值诉求：使用如“感动”、“泪目”、“经典”等词汇，直接与读者的情感或价值观产生共鸣。
        避免误导：确保标题准确反映内容，避免夸大或误导读者。
    """
    return prompt


def update_status(content_id, ori, new_):
    """
    update status
    """
    sql = """
        update long_articles_temp
        set status = %s
        where content_id = %s and status = %s;
        """
    rows = lam.update(sql=sql, params=(new_, content_id, ori))
    return rows


def get_task_list():
    """
    get task list
    """
    sql = """
        select t1.content_id, t2.article_title from long_articles_temp t1
        join long_articles_text t2 on t1.content_id = t2.content_id
        where t1.status = 0;
        """
    resp = lam.select(sql, cursor_type=DictCursor)
    return resp


def update_temp(content_id, new_title):
    """
    update temp
    """
    sql = """
        update long_articles_temp 
        set new_kimi_title = %s, status = %s
        where content_id = %s and status = %s;
        """
    lam.update(sql=sql, params=(new_title, 1, content_id, 101))


def process_task(task):
    """
    print
    """
    content_id = task['content_id']
    article_title = task['article_title']
    prompt = generate_prompt(article_title)
    # lock
    r = update_status(content_id=content_id, ori=0, new_=101)
    if not r:
        return
    try:
        title = fetch_deepseek_response(model="DeepSeek-V3", prompt=prompt)
        update_temp(content_id, title)
    except Exception as e:
        # roll back
        update_status(content_id=content_id, ori=101, new_=0)
        print(e)


def main():
    """
    main function
    """
    task_list = get_task_list()
    for task in tqdm(task_list):
        process_task(task)


if __name__ == '__main__':
    main()
