from hamilton.function_modifiers import parametrized_input, parameterized_inputs


def input_1() -> int:
    return 1


def input_2() -> int:
    return 2


def input_3() -> int:
    return 3


@parametrized_input(
    parameter='input_value_tbd',
    variable_inputs={
        'input_1': ('output_1', 'function_with_multiple_inputs called using input_1'),
        'input_2': ('output_2', 'function_with_multiple_inputs called using input_2')
    }
)
def function_with_multiple_inputs(input_value_tbd: int, static_value: int) -> int:
    return input_value_tbd + static_value


# We don't prefer this style of specifying the values. i.e. kwarg with {}.
@parameterized_inputs(
    output_12={'input_value_tbd1': 'input_1', 'input_value_tbd2': 'input_2'}
)
def function_with_two_parameters(input_value_tbd1: int,
                                 input_value_tbd2: int,
                                 static_value: int) -> int:
    """function_with_multiple_inputs called using {input_value_tbd1} and {input_value_tbd2}

    :return: creates {output_name}
    """
    return input_value_tbd1 + input_value_tbd2 + static_value


# We prefer this style of specifying the values. i.e. kwarg with dict().
@parameterized_inputs(
    output_123=dict(input_value_tbd1='input_1',
                    input_value_tbd2='input_2',
                    input_value_tbd3='input_3')
)
def function_with_three_parameters(input_value_tbd1: int,
                                   input_value_tbd2: int,
                                   input_value_tbd3: int,
                                   static_value: int) -> int:
    """function_with_multiple_inputs called using {input_value_tbd1} and {input_value_tbd2} and {input_value_tbd3}

    :param {input_value_tbd1}:
    :param {input_value_tbd2}:
    :param {input_value_tbd3}:
    :param static_value:
    :return: {output_name}
    """
    return input_value_tbd1 + input_value_tbd2 + input_value_tbd3 + static_value
