from urllib.parse import quote

from flask import redirect
from flask import request
from flask import jsonify

from gutenberg_http import app
from gutenberg_http import cache
from gutenberg_http import config
from gutenberg_http import errors
from gutenberg_http import logic


@app.route('/')
def index():
    return redirect('{test_page_url}?server={server}'.format(
        test_page_url=config.TEST_PAGE_URL,
        server=quote(request.host)))


@app.route('/texts/<int:text_id>')
@cache.cached(query_string=True)
def metadata(text_id: int):
    include = logic.metadata(text_id, request.args.get('include'))
    return jsonify({'text_id': text_id, 'metadata': include})


@app.route('/texts/<int:text_id>/body')
@cache.cached(query_string=True)
def body(text_id: int):
    fulltext = logic.body(text_id)
    return jsonify({'text_id': text_id, 'body': fulltext})


@app.route('/search/<query>')
def search(query: str):
    results = logic.search(query, request.args.get('include'))
    return jsonify({'texts': results})


@app.errorhandler(errors.InvalidUsage)
def bad_request(exception: errors.InvalidUsage):
    error = {'error': 'invalid_usage', 'message': exception.message}
    return jsonify(error), exception.status_code


@app.errorhandler(Exception)
def on_exception(exception: Exception):
    error = {'error': exception.__class__.__name__, 'message': str(exception)}
    return jsonify(error), getattr(exception, 'status_code', 500)


@app.route('/healthcheck')
def healthcheck():
    return jsonify({
        'db': {
            'freshness': logic.db_freshness(),
        },
    })