#!/usr/bin/env python

r"""
This module provides functions which are useful for writing python wrapper functions (i.e. in this context, a
wrapper function is one whose aim is to call some other function on the caller's behalf but to provide some
additional functionality over and above what the base function provides).
"""

import sys
import inspect


def create_wrapper_def_and_call(base_func_name,
                                wrap_func_name):
    r"""
    Return a wrapper function definition line and a base function call line.

    This is a utility for helping to create wrapper functions.

    For example, if there existed a function with the following definition line:
    def sprint_foo_bar(headers=1):

    And the user wished to write a print_foo_bar wrapper function, they could call
    create_wrapper_def_and_call as follows:

    func_def_line, call_line = create_wrapper_def_and_call("sprint_foo_bar",
                                                           "print_foo_bar")

    They would get the following results:
    func_def_line                   def print_foo_bar(headers=1):
    call_line                       sprint_foo_bar(headers=headers)

    The func_def_line is suitable as the definition line for the wrapper function.  The call_line is suitable
    for use in the new wrapper function wherever it wishes to call the base function.  By explicitly
    specifying each parm in the definition and the call line, we allow the caller of the wrapper function to
    refer to any given parm by name rather than having to specify parms positionally.

    Description of argument(s):
    base_func_name                  The name of the base function around which a wrapper is being created.
    wrap_func_name                  The name of the wrapper function being created.
    """

    # Get caller's module name.  Note: that for the present we've hard-coded the stack_frame_ix value
    # because we expect a call stack to this function to be something like this:
    # caller
    #   create_print_wrapper_funcs
    #     create_func_def_string
    #       create_wrapper_def_and_call
    stack_frame_ix = 3
    frame = inspect.stack()[stack_frame_ix]
    module = inspect.getmodule(frame[0])
    mod_name = module.__name__

    # Get a reference to the base function.
    base_func = getattr(sys.modules[mod_name], base_func_name)
    # Get the argument specification for the base function.
    base_arg_spec = inspect.getargspec(base_func)
    base_arg_list = base_arg_spec[0]
    num_args = len(base_arg_list)
    # Get the variable argument specification for the base function.
    var_args = base_arg_spec[1]
    if var_args is None:
        var_args = []
    else:
        var_args = ["*" + var_args]
    keyword_args = base_arg_spec[2]
    if keyword_args is None:
        keyword_args = []
    else:
        keyword_args = ["**" + keyword_args]
    if base_arg_spec[3] is None:
        base_default_list = []
    else:
        base_default_list = list(base_arg_spec[3])
    num_defaults = len(base_default_list)
    num_non_defaults = num_args - num_defaults

    # Create base_arg_default_string which is a reconstruction of the base function's argument list.
    # Example base_arg_default_string:
    # headers, last=2, first=[1]
    # First, create a new list where each entry is of the form "arg=default".
    base_arg_default_list = list(base_arg_list)
    for ix in range(num_non_defaults, len(base_arg_default_list)):
        base_default_ix = ix - num_non_defaults
        if isinstance(base_default_list[base_default_ix], str):
            default_string = "'" + base_default_list[base_default_ix] + "'"
            # Convert "\n" to "\\n".
            default_string = default_string.replace("\n", "\\n")
        else:
            default_string = str(base_default_list[base_default_ix])
        base_arg_default_list[ix] += "=" + default_string
    base_arg_default_string =\
        ', '.join(base_arg_default_list + var_args + keyword_args)

    # Create the argument string which can be used to call the base function.
    # Example call_arg_string:
    # headers=headers, last=last, first=first
    call_arg_string = ', '.join([val + "=" + val for val in base_arg_list]
                                + var_args + keyword_args)

    # Compose the result values.
    func_def_line = "def " + wrap_func_name + "(" + base_arg_default_string +\
        "):"
    call_line = base_func_name + "(" + call_arg_string + ")"

    return func_def_line, call_line


def create_func_def_string(base_func_name,
                           wrap_func_name,
                           func_body_template,
                           replace_dict):
    r"""
    Create and return a complete function definition as a string.  The caller may run "exec" on the resulting
    string to create the desired function.

    Description of argument(s):
    base_func_name                  The name of the base function around which a wrapper is being created.
    wrap_func_name                  The name of the wrapper function being created.
    func_body_template              A function body in the form of a list.  Each list element represents one
                                    line of a function  This is a template in so far as text substitutions
                                    will be done on it to arrive at a valid function definition.  This
                                    template should NOT contain the function definition line (e.g. "def
                                    func1():").  create_func_def_string will pre-pend the definition line.
                                    The template should also contain the text "<call_line>" which is to be
                                    replaced by text which will call the base function with appropriate
                                    arguments.
    replace_dict                    A dictionary indicating additional text replacements to be done.  For
                                    example, if the template contains a "<sub1>" (be sure to include the
                                    angle brackets), and the dictionary contains a key/value pair of
                                    'sub1'/'replace1', then all instances of "<sub1>" will be replaced by
                                    "replace1".
    """

    # Create the initial function definition list as a copy of the template.
    func_def = list(func_body_template)
    # Call create_wrapper_def_and_call to get func_def_line and call_line.
    func_def_line, call_line = create_wrapper_def_and_call(base_func_name,
                                                           wrap_func_name)
    # Insert the func_def_line composed by create_wrapper_def_and_call is the first list entry.
    func_def.insert(0, func_def_line)
    # Make sure the replace_dict has a 'call_line'/call_line pair so that any '<call_line>' text gets
    # replaced as intended.
    replace_dict['call_line'] = call_line

    # Do the replacements.
    for key, value in replace_dict.items():
        func_def = [w.replace("<" + key + ">", value) for w in func_def]

    return '\n'.join(func_def) + "\n"
