"""Test reporting origin server used for two reasons:

  1. It is a workaround for lack of preflight support in the test server.
  2. Stashes requests so they can be inspected by tests.
"""

from wptserve.stash import Stash
import json

REQUESTS = "9250f93f-2c05-4aae-83b9-2817b0e18b4d"


headers = [
    b"attribution-reporting-eligible",
    b"attribution-reporting-support",
    b"referer",
]


def store_request(request) -> None:
    obj = {
        "method": request.method,
        "url": request.url,
    }
    for header in headers:
        value = request.headers.get(header)
        if value is not None:
            obj[str(header, "utf-8")] = str(value, "utf-8")
    with request.server.stash.lock:
        requests = request.server.stash.take(REQUESTS)
        if not requests:
            requests = []
        requests.append(obj)
        request.server.stash.put(REQUESTS, requests)
    return None


def get_requests(request) -> str:
    with request.server.stash.lock:
        return json.dumps(request.server.stash.take(REQUESTS))


def main(request, response):
    """
    For most requests, simply returns a 200. Actual source/trigger registration
    headers are piped using the `pipe` query param.

    If a `clear-stash` param is set, it will clear the stash.
    """
    if request.GET.get(b"clear-stash"):
        request.stash.take(REQUESTS)
        return

    # We dont want to redirect preflight requests. The cors headers are piped
    # so we can simply return a 200 and redirect the following request
    if request.method == "OPTIONS":
        response.status = 200
        return

    if request.GET.get(b"get-requests"):
        return get_requests(request)

    if request.GET.get(b"store-request"):
        store_request(request)
        return ""
