import gradio as gr

disable_btn = gr.Button(interactive=False, visible=False)


def get_ip(request: gr.Request) -> str:
    """
    Retrieve the IP address from an incoming HTTP request.

    Args:
        request (gr.Request):
            The incoming HTTP request from which the IP address will be extracted.

    Returns:
        str:
            The IP address as a string.
    """
    if "cf-connecting-ip" in request.headers:
        ip = request.headers["cf-connecting-ip"]
    elif "x-forwarded-for" in request.headers:
        ip = request.headers["x-forwarded-for"]
        if "," in ip:
            ip = ip.split(",")[0]
    else:
        ip = request.client.host
    return ip


def natural_vote1_last_response(request: gr.Request):
    """
    Handle a user vote for naturalness as "Very Natural".


    Args:
        request (gr.Request):
            The Gradio request object providing access to HTTP headers and metadata.

    Returns:
        tuple:
            A tuple containing:
            ("Very Natural", <ip_address>, (disable_btn,) * 4)

            - "Very Natural": The selected vote or label.
            - <ip_address>: The IP address of the client retrieved from the request.
            - disable_btn: An object repeated four times,
            to disable natural vote buttons.
    """
    ip_address1 = get_ip(request)
    print(f"Very Natural (voted). ip: {ip_address1}")
    return (
        "Very Natural",
        ip_address1,
    ) + (disable_btn,) * 4


def natural_vote2_last_response(request: gr.Request):
    """
    Handle a user vote for naturalness as "Somewhat Awkward".


    Args:
        request (gr.Request):
            The Gradio request object providing access to HTTP headers and metadata.

    Returns:
        tuple:
            A tuple containing:
            ("Somewhat Awkward", <ip_address>, (disable_btn,) * 4)

            - "Somewhat Awkward": The selected vote or label.
            - <ip_address>: The IP address of the client retrieved from the request.
            - disable_btn: An object repeated four times,
            to disable natural vote buttons.
    """
    ip_address1 = get_ip(request)
    print(f"Somewhat Awkward (voted). ip: {ip_address1}")
    return (
        "Somewhat Awkward",
        ip_address1,
    ) + (disable_btn,) * 4


def natural_vote3_last_response(request: gr.Request):
    """
    Handle a user vote for naturalness as "Very Awkward".


    Args:
        request (gr.Request):
            The Gradio request object providing access to HTTP headers and metadata.

    Returns:
        tuple:
            A tuple containing:
            ("Very Awkward", <ip_address>, (disable_btn,) * 4)

            - "Very Awkward": The selected vote or label.
            - <ip_address>: The IP address of the client retrieved from the request.
            - disable_btn: An object repeated four times,
            to disable natural vote buttons.
    """
    ip_address1 = get_ip(request)
    print(f"Very Awkward (voted). ip: {ip_address1}")
    return (
        "Very Awkward",
        ip_address1,
    ) + (disable_btn,) * 4


def natural_vote4_last_response(request: gr.Request):
    """
    Handle a user vote for naturalness as "Unnatural".


    Args:
        request (gr.Request):
            The Gradio request object providing access to HTTP headers and metadata.

    Returns:
        tuple:
            A tuple containing:
            ("Unnatural", <ip_address>, (disable_btn,) * 4)

            - "Unnatural": The selected vote or label.
            - <ip_address>: The IP address of the client retrieved from the request.
            - disable_btn: An object repeated four times,
            to disable natural vote buttons.
    """
    ip_address1 = get_ip(request)
    print(f"Unnatural (voted). ip: {ip_address1}")
    return (
        "Unnatural",
        ip_address1,
    ) + (disable_btn,) * 4


def relevant_vote1_last_response(request: gr.Request):
    """
    Handle a user vote for relevance as "Highly Relevant".


    Args:
        request (gr.Request):
            The Gradio request object providing access to HTTP headers and metadata.

    Returns:
        tuple:
            A tuple containing:
            ("Highly Relevant", <ip_address>, (disable_btn,) * 4)

            - "Highly Relevant": The selected vote or label.
            - <ip_address>: The IP address of the client retrieved from the request.
            - disable_btn: An object repeated four times,
            to disable relevance vote buttons.
    """
    ip_address1 = get_ip(request)
    print(f"Highly Relevant (voted). ip: {ip_address1}")
    return (
        "Highly Relevant",
        ip_address1,
    ) + (disable_btn,) * 4


def relevant_vote2_last_response(request: gr.Request):
    """
    Handle a user vote for relevance as "Partially Relevant".


    Args:
        request (gr.Request):
            The Gradio request object providing access to HTTP headers and metadata.

    Returns:
        tuple:
            A tuple containing:
            ("Partially Relevant", <ip_address>, (disable_btn,) * 4)

            - "Partially Relevant": The selected vote or label.
            - <ip_address>: The IP address of the client retrieved from the request.
            - disable_btn: An object repeated four times,
            to disable relevance vote buttons.
    """
    ip_address1 = get_ip(request)
    print(f"Partially Relevant (voted). ip: {ip_address1}")
    return (
        "Partially Relevant",
        ip_address1,
    ) + (disable_btn,) * 4


def relevant_vote3_last_response(request: gr.Request):
    """
    Handle a user vote for relevance as "Slightly Irrelevant".


    Args:
        request (gr.Request):
            The Gradio request object providing access to HTTP headers and metadata.

    Returns:
        tuple:
            A tuple containing:
            ("Slightly Irrelevant", <ip_address>, (disable_btn,) * 4)

            - "Slightly Irrelevant": The selected vote or label.
            - <ip_address>: The IP address of the client retrieved from the request.
            - disable_btn: An object repeated four times,
            to disable relevance vote buttons.
    """
    ip_address1 = get_ip(request)
    print(f"Slightly Irrelevant (voted). ip: {ip_address1}")
    return (
        "Slightly Irrelevant",
        ip_address1,
    ) + (disable_btn,) * 4


def relevant_vote4_last_response(request: gr.Request):
    """
    Handle a user vote for relevance as "Completely Irrelevant".


    Args:
        request (gr.Request):
            The Gradio request object providing access to HTTP headers and metadata.

    Returns:
        tuple:
            A tuple containing:
            ("Completely Irrelevant", <ip_address>, (disable_btn,) * 4)

            - "Completely Irrelevant": The selected vote or label.
            - <ip_address>: The IP address of the client retrieved from the request.
            - disable_btn: An object repeated four times,
            to disable relevance vote buttons.
    """
    ip_address1 = get_ip(request)
    print(f"Completely Irrelevant (voted). ip: {ip_address1}")
    return (
        "Completely Irrelevant",
        ip_address1,
    ) + (disable_btn,) * 4