import random
import string

from wptserve.utils import isomorphic_encode

def id_token():
   letters = string.ascii_lowercase
   return u''.join(random.choice(letters) for i in range(20))

def main(request, response):
    client_hint_headers = [
        b"device-memory",
        b"dpr",
        b"width",
        b"viewport-width",
        b"rtt",
        b"downlink",
        b"ect",
        b"sec-ch-lang",
        b"sec-ch-ua",
        b"sec-ch-ua-arch",
        b"sec-ch-ua-platform",
        b"sec-ch-ua-platform-version",
        b"sec-ch-ua-model",
    ]

    client_hints_curr = {i:request.headers.get(i) for i in client_hint_headers}

    token = request.GET.first(b"token", None)
    is_query = request.GET.first(b"query", None) is not None
    with request.server.stash.lock:
      stash = request.server.stash.take(token)
      if stash != None:
        (value, client_hints_prev) = stash
        count = int(value)
      else:
        count = 0
        client_hints_prev = {}

      if is_query:
        if count < 2:
          request.server.stash.put(token, (count, client_hints_curr))
      else:
        count = count + 1
        request.server.stash.put(token, (count, client_hints_curr))

    for header in client_hint_headers:
      if client_hints_curr[header] is not None:
        response.headers.set(header+b"-recieved", client_hints_curr[header])
      if (header in client_hints_prev) and (client_hints_prev[header] is not None):
        response.headers.set(header+b"-previous", client_hints_prev[header])

    if is_query:
      headers = [(b"Count", count)]
      content = u""
      return 200, headers, content
    else:
      unique_id = id_token()
      headers = [(b"Content-Type", b"text/html"),
                 (b"Cache-Control", b"private, max-age=0, stale-while-revalidate=60"),
                 (b"Unique-Id", isomorphic_encode(unique_id))]
      content = u"report('{}')".format(unique_id)
      return 200, headers, content
