import time
import logging
import hmac
import hashlib


def generate_temp_url(path, seconds, key, method):
    """ Generates a temporary URL that gives unauthenticated access to the
    Swift object.

    :param path: The full path to the Swift object. Example:
    /v1/AUTH_account/c/o.
    :param seconds: The amount of time in seconds the temporary URL will
    be valid for.
    :param key: The secret temporary URL key set on the Swift cluster.
    To set a key, run 'swift post -m
    "Temp-URL-Key:b3968d0207b54ece87cccc06515a89d4"'
    :param method: A HTTP method, typically either GET or PUT, to allow for
    this temporary URL.
    :raises: ValueError if seconds is not a positive integer
    :raises: TypeError if seconds is not an integer
    :return: the path portion of a temporary URL
    """
    if seconds < 0:
        raise ValueError('seconds must be a positive integer')
    try:
        expiration = int(time.time() + seconds)
    except TypeError:
        raise TypeError('seconds must be an integer')

    standard_methods = ['GET', 'PUT', 'HEAD', 'POST', 'DELETE']
    if method.upper() not in standard_methods:
        logger = logging.getLogger("swiftclient")
        logger.warning('Non default HTTP method %s for tempurl specified, '
                       'possibly an error', method.upper())

    hmac_body = '\n'.join([method.upper(), str(expiration), path])

    # Encode to UTF-8 for py3 compatibility
    sig = hmac.new(key.encode(),
                   hmac_body.encode(),
                   hashlib.sha1).hexdigest()

    return ('{path}?temp_url_sig='
            '{sig}&temp_url_expires={exp}'.format(
                path=path,
                sig=sig,
                exp=expiration)
            )