import json

from camel.functions.openai_function import OpenAIFunction


def trust_or_not_FC(Believe, Desire, Intention, Trust_or_not, Risk, Strategy, Think):
    """
    Determines if one should trust based on their beliefs, desires, intentions, risk, strategy, and thinking.

    Args:
        Believe (any): The belief factor.
        Desire (any): The desire factor.
        Intention (any): The intention factor.
        Trust_or_not (any): The choice to trust or not.
        Risk (any): The risk assessment.
        Strategy (any): The strategy considered.
        Think (any): The thinking process or reasoning.

    Returns:
        Dict[str, Any]: A dictionary containing the model's answer with keys for Believe, Desire, Intention, Trust_or_not, Risk, Strategy, and Think.
    """
    model_answer = {
        "Believe": Believe,
        "Desire": Desire,
        "Intention": Intention,
        "Trust_or_not": Trust_or_not,
        "Risk": Risk,
        "Strategy": Strategy,
        "Think": Think
    }
    return model_answer


def given_money_FC(Believe, Desire, Intention, money_num, Risk, Strategy, Think):
    """
    Determines the amount of money given based on beliefs, desires, and intentions.

    Args:
        Believe (any): The belief factor.
        Desire (any): The desire factor.
        Intention (any): The intention factor.
        money_num (any): The amount of money being considered.
        Risk (any): The risk assessment related to the money.
        Strategy (any): The strategy considered in relation to the money.
        Think (any): The thinking process or reasoning behind the money decision.

    Returns:
        Dict[str, Any]: A dictionary containing the model's answer with keys for Believe, Desire, Intention, and money_num.
    """
    model_answer = {
        "Believe": Believe,
        "Desire": Desire,
        "Intention": Intention,
        "money_num": money_num,
        "Risk": Risk,
        "Strategy": Strategy,
        "Think": Think
    }
    return model_answer


money_paramters = {
    "type": "object",
    "properties": {
        "Believe": {
            "type": "string",
            "description": "What's your Believe?",
        },
        "Desire": {
            "type": "string",
            "description": "What do you desire?",
        },
        "Intention": {
            "type": "string",
            "description": "What's your Intention?",
        },
        "money_num": {
            "type": "string",
            "description": "How much money would you give each other",
        },
        "Risk": {
            "type": "string",
            "description": "What is the potential risk in the game?"
        },
        "Strategy": {
            "type": "string",
            "description": " what is the potential strategies in the game?"
        },
        "Think": {
            "type": "string",
            "description": "The thinking progress in this game"
        }
    },
    "required": ["Believe", "Desire", "Intention", "money_num", "Risk", "Strategy", "Think"],
}

trust_paramters = {
    "type": "object",
    "properties": {
        "Believe": {
            "type": "string",
            "description": "What's your Believe?",
        },
        "Desire": {
            "type": "string",
            "description": "What do you desire?",
        },
        "Intention": {
            "type": "string",
            "description": "What's your Intention?",
        },
        "Trust_or_not": {
            "type": "string",
            "description": "Do you trust each other? Only responce 'trust' or 'not trust'",
        },
        "Risk": {
            "type": "string",
            "description": "What is the potential risk in the game?"
        },
        "Strategy": {
            "type": "string",
            "description": " what is the potential strategies in the game?"
        },
        "Think": {
            "type": "string",
            "description": "The thinking progress in this game"
        }
    },
    "required": ["Believe", "Desire", "Intention", "Trust_or_not", 'Risk', 'Strategy', "Think"],
}


def get_function_call_res(message):
    if message.get("function_call"):
        function_name = message["function_call"]["name"]
        ans = json.loads(message["function_call"]["arguments"])
        func = globals().get(function_name)
        res = func(**ans)

        return res


money_call = OpenAIFunction(
    func=given_money_FC,
    name="given_money_FC",
    description="This function is need when inquiring about the amount of money to give.",
    parameters=money_paramters,
)

trust_call = OpenAIFunction(
    func=trust_or_not_FC,
    name="trust_or_not_FC",
    description="You choose to trust each other or not trust each other?",
    parameters=trust_paramters,
)

function_list = [money_call.as_dict(), trust_call.as_dict()]