from arcade.sdk import ToolCatalog
from arcade.sdk.eval import (
    EvalRubric,
    EvalSuite,
    ExpectedToolCall,
    tool_eval,
)
from arcade.sdk.eval.critic import BinaryCritic, SimilarityCritic

import arcade_reddit
from arcade_reddit.tools import (
    submit_text_post,
)
from arcade_reddit.tools.submit import comment_on_post
from evals.additional_messages import get_post_in_subreddit_messages
from evals.critics import AnyOfCritic

# Evaluation rubric
rubric = EvalRubric(
    fail_threshold=0.85,
    warn_threshold=0.95,
)


catalog = ToolCatalog()
catalog.add_module(arcade_reddit)


@tool_eval()
def reddit_submit_text_post_eval_suite() -> EvalSuite:
    suite = EvalSuite(
        name="reddit_submit_text_post_1",
        system_message=(
            "You are an AI assistant with access to reddit tools. "
            "Use them to help the user with their tasks."
        ),
        catalog=catalog,
        rubric=rubric,
    )

    suite.add_case(
        name="reddit_submit_text_post_1",
        user_message=(
            "Post this in AskReddit - 'Why is the sky blue?'. I dont want replies sent to my dms"
        ),
        expected_tool_calls=[
            ExpectedToolCall(
                func=submit_text_post,
                args={
                    "subreddit": "AskReddit",
                    "title": "Why is the sky blue?",
                    "send_replies": False,
                },
            ),
        ],
        rubric=rubric,
        critics=[
            BinaryCritic(critic_field="subreddit", weight=0.3),
            BinaryCritic(critic_field="title", weight=0.3),
            BinaryCritic(critic_field="body", weight=0.3),
            BinaryCritic(critic_field="send_replies", weight=0.1),
        ],
    )

    return suite


@tool_eval()
def reddit_comment_on_post_eval_suite() -> EvalSuite:
    suite = EvalSuite(
        name="reddit_comment_on_post_1",
        system_message=(
            "You are an AI assistant with access to reddit tools. "
            "Use them to help the user with their tasks."
        ),
        catalog=catalog,
        rubric=rubric,
    )

    comment = "Your dog's four-legged structure is a manifestation of tetrapodal evolution, where natural selection has optimized limb development for biomechanical stability and efficient terrestrial locomotion. Duh!"  # noqa: E501
    suite.add_case(
        name="reddit_comment_on_post_1",
        user_message=(f"here's my comment - {comment}"),
        expected_tool_calls=[
            ExpectedToolCall(
                func=comment_on_post,
                args={
                    "post_identifier": [  # post_identifier can be any of the following
                        "1abcdef",
                        "t3_1abcdef",
                        "https://www.reddit.com/r/AskReddit/comments/1abcdef/why_does_my_dog_have_four_legs/",
                        "/r/AskReddit/comments/1abcdef/why_does_my_dog_have_four_legs/",
                    ],
                    "text": comment,
                },
            ),
        ],
        rubric=rubric,
        critics=[
            AnyOfCritic(critic_field="post_identifier", weight=0.5),
            SimilarityCritic(critic_field="text", weight=0.5),
        ],
        additional_messages=get_post_in_subreddit_messages,
    )

    return suite
