import os
import asyncio
from typing import Optional, Dict
from taskflow import FileIOHandler
from api_modules.ark_client_async import AsyncArkClient
from api_modules.ark_client import ArkMessage, APIError
from taskflow import get_logger

io_handler = FileIOHandler()
logger = get_logger("examples.refer_video_create.mcps.script_check")

prompt_check_image_script = \
"""
【Role】
你是一个非常细心的图像质量评估专家

【Background】
我正在使用AIGC工具进行图像生成，但是经常出现生成的图像存在缺陷的情况
我需要你帮忙审查生成的图像，当你审查判断为图像存在缺陷时，我便筛除这张图像

【Goal】
分析输入图像是否存在AI生成的不合理之处，包括但不限于：
- 解剖/比例错误：手指数量异常、头身比失调、肢体扭曲等
- 空间/透视错误：多人物不在同一地平线、遮挡关系矛盾、近大远小失效、多角色空间布局错误、人物站位等
- 物体一致性缺失：文本说“穿红衣服”图像却是蓝衣；“三只猫”却画了四只等
- 伪影与纹理异常：模糊区域、重复图案、非自然噪点（如“融化的脸”）等
- 常识/逻辑违背：人坐在空中无椅子、钟表指针反向、水往高处流等
- 穿模问题：人物或物体穿透了其他人物或物体等任何穿模问题

**需重点关注的问题**（需重点关注，务必严格审查）：
- 人体是否存在不合理的变形或扭曲、身体构造错误等、关节异常等
- 多人物场景中，人物是否存在不合理的遮挡、穿透、重叠、融合等问题（包括但**不限于**：人物穿透了其他人物、人物穿透了物体）
- 人物的头、四肢、关节、完整的身体构造必须仔细一一检查
- 是否存在物品悬浮、悬空、漂浮等不合理现象（包括但**不限于**：人物手上的包包、手机、书包等物品在不拿着的情况下悬浮、悬空、漂浮等；或物品突然消失或突然出现的情况）
- 是否存在人物身体呈侧后方姿态，但头部却面向镜头的情况（需要思考推理判断，可通过头、身体、四肢所面向的方向/角度来判断）

【Constraints】
- 对可能存在的问题进行逐个分析审查
- 你的内部分析推理不能少于5000字！（这部分不用输出，但你必须进行内部推理，确保没有遗漏问题！）
- 以JSON格式输出，仅包含**review_result**（取值范围：ture/false）和**result reason**两个字段
- 除以JSON格式输出结果之外，不要用任何其他内容输出（重要！）

【Output Format】
```json
{
    "review_result": // bool；审查结果；必填
    "result_reason": // text；对审查结果的解释；必填；字数不少于1000字
}
```

## 让我们一步步来分析
"""


prompt_check_video_script = \
"""
【Role】
你是一个非常细心且有工作激情的视频质量评估专家

【Background】
我正在使用AIGC工具进行视频生成，但是经常出现生成的视频存在缺陷的情况
我需要你帮忙审查生成的视频，当你审查判断为视频存在缺陷时，我便筛除这段视频

【Goal】
分析输入视频是否存在AI生成的不合理之处，包括但不限于：
- 解剖/比例错误：手指数量异常、头身比失调、肢体扭曲等
- 空间/透视错误：多人物不在同一地平线、遮挡关系矛盾、近大远小失效、多角色空间布局错误、人物站位等
- 常识/逻辑违背：人坐在空中无椅子、物品悬浮悬空漂浮等
- 穿模问题：人物或物体穿透了其他人物或物体等任何穿模问题

**需重点关注的问题**（需重点关注，务必严格审查）：
- 人物运动过程中，肢体是否存在不合理的变形或扭曲
- 多人物场景中，人物是否存在不合理的遮挡、穿透、重叠、融合等问题（包括但**不限于**：人物穿透了其他人物、人物穿透了物体）
- 任何物品是否存在突然消失或突然出现的情况（包括但**不限于**：人物手中的物品突然消失或突然出现）

【Constraints】
- 对可能存在的问题进行逐个分析审查
- 除列举的问题之外，不得遗漏任何你发现的不合理、不符合物理规律、不符合常识、不符合逻辑的问题（重要！）
- 你需要先假定如果这个视频存在质量问题，那么经过你的仔细分析，具体的质量问题是什么？（重要！这是避免遗漏问题的关键！）
- 你的内部推理不能少于5000字！（这部分不用输出，但你必须进行内部推理，确保没有遗漏问题！）
- 以JSON格式输出，仅包含**review_result**（取值范围：ture/false）和**result reason**两个字段
- 除以JSON格式输出结果之外，不要用任何其他内容输出（重要！）

【Output Format】
```json
{
    "review_result": // bool；审查结果；必填
    "result_reason": // text；对审查结果的解释；必填；字数不少于1000字
}
```

## 请对输入图像逐像素逐像素仔细检查分析，得出经过审慎审查后的结果
"""

async def check_image_script(
    client: AsyncArkClient,
    image_prompt: str,
    image_url: str
) -> str:
    user_message = ArkMessage(role="user")
    user_message.add_text(image_prompt)
    user_message.add_image(image_url)

    try:
        response = await client.chat(
            model="doubao-seed-1-6-251015",
            messages=[user_message],
            system_prompt=prompt_check_image_script,
        )
        logger.info(f"检查图像脚本成功")
        return client.get_response_text(response)
    except APIError as e:
        logger.error(f"API错误: {e}")
        raise e

async def check_video_script(
    client: AsyncArkClient,
    video_prompt: str,
    video_url: str
) -> str:
    user_message = ArkMessage(role="user")
    user_message.add_text(video_prompt)
    user_message.add_video(video_url)

    try:
        response = await client.chat(
            model="doubao-seed-1-6-251015",
            messages=[user_message],
            system_prompt=prompt_check_video_script,
        )
        logger.info(f"检查视频脚本成功")
        return client.get_response_text(response)
    except APIError as e:
        logger.error(f"API错误: {e}")
        raise e

if __name__ == "__main__":
    async def main():
        async with AsyncArkClient() as client:
            review_result = await check_image_script(
                client=client,
                image_prompt="请逐像素逐像素仔细检查分析，得出经过审慎审查后的结果",
                image_url="./output/run_20260107_111034/storyboard/lens_1_run_20260107_111034.png" 
            )
            print(review_result)
            review_result = await check_video_script(
                client=client,
                video_prompt="请逐帧逐帧仔细分析，得出经过审慎审查后的结果",
                video_url="./output/run_20260107_111034/video_clips/lens_1_run_20260107_111034.mp4" 
            )
            print(review_result)
    asyncio.run(main())
