# -*- coding: utf-8 -*-

from inspect import getargspec
from functools import wraps


def osv_method(f):
    """Decorator with boilerplate for OSV methods."""

    args, varargs, kwargs, defaults = getargspec(f)
    # Drop first 4 arguments (self, cr, uid, ids)
    len_argspec = len(args) - 4

    # Sanity check: no *args or **kwargs parameters
    assert varargs is kwargs is None
    # Sanity check: last argument is 'context'
    assert len_argspec > 0 and args[-1] == 'context'

    # Clean-up locals
    del args, varargs, kwargs, defaults

    @wraps(f)
    def wrapper(self, cr, uid, ids, *args, **kwargs):
        # Ensure 'ids' is a list (or a tuple)
        if isinstance(ids, (int, long)):
            ids = [ids]
        elif not ids:
            ids = []
        # Assign default empty dict for 'context'.
        if len(args) == len_argspec:
            # 'context' is a positional argument
            if not kwargs and args[-1] is None:
                args = args[:-1]
                kwargs['context'] = {}
        elif kwargs.get('context') is None:
            # 'context' is a keyword argument (or missing)
            kwargs['context'] = {}
        return f(self, cr, uid, ids, *args, **kwargs)

    return wrapper
