from typing import Dict, List

from flask import Response, jsonify, request
from teal.query import NestedQueryFlaskParser
from webargs.flaskparser import FlaskParser


class SearchQueryParser(NestedQueryFlaskParser):

    def parse_querystring(self, req, name, field):
        if name == 'search':
            v = FlaskParser.parse_querystring(self, req, name, field)
        else:
            v = super().parse_querystring(req, name, field)
        return v


def things_response(items: List[Dict],
                    page: int = None,
                    per_page: int = None,
                    total: int = None,
                    previous: int = None,
                    next: int = None,
                    url: str = None,
                    code: int = 200) -> Response:
    """Generates a Devicehub API list conformant response for multiple
    things.
    """
    response = jsonify({
        'items': items,
        # todo pagination should be in Header like github
        # https://developer.github.com/v3/guides/traversing-with-pagination/
        'pagination': {
            'page': page,
            'perPage': per_page,
            'total': total,
            'previous': previous,
            'next': next
        },
        'url': url or request.path
    })
    response.status_code = code
    return response