"""Server-side signing examples; no API requests are made by this module."""
import hashlib
import hmac
import time
import uuid


def signed_headers(*, method, path, key_id, secret, query='', body='', timestamp=None, nonce=None):
    if not key_id or not secret:
        raise ValueError('Server-side API credentials are required')
    if '{' in path or '}' in path:
        raise ValueError('Resolve path variables before signing')
    timestamp = str(int(time.time())) if timestamp is None else str(timestamp)
    nonce = uuid.uuid4().hex if nonce is None else nonce
    body_hash = hashlib.sha256(body.encode('utf-8')).hexdigest()
    canonical = '\n'.join([method.upper(), path, query, timestamp, nonce, body_hash])
    signature = hmac.new(secret.encode('utf-8'), canonical.encode('utf-8'), hashlib.sha256).hexdigest()
    return {'X-API-KEY-ID': key_id, 'X-API-TIMESTAMP': timestamp,
            'X-API-NONCE': nonce, 'X-API-SIGNATURE': signature}


def plugin_signed_headers(*, method, path, key_id, secret, body='', timestamp=None):
    if not key_id or not secret:
        raise ValueError('Server-side API credentials are required')
    if '{' in path or '}' in path:
        raise ValueError('Resolve path variables before signing')
    timestamp = str(int(time.time())) if timestamp is None else str(timestamp)
    canonical = f'{timestamp}.{method.upper()}.{path}.{body}'
    signature = hmac.new(secret.encode('utf-8'), canonical.encode('utf-8'), hashlib.sha256).hexdigest()
    return {'X-ZytePe-Api-Key': key_id, 'X-ZytePe-Timestamp': timestamp,
            'X-ZytePe-Signature': signature}
