import importlib.resources
import re

import bicephalus
import htmlgenerator as h

from blog import blog_pages, gemtext, html, page, pretty

STATIC = importlib.resources.files("static").iterdir().__next__().parent


class SimplePage(page.BasePage):
    def __init__(self, request, url, title):
        super().__init__(request)
        self.url = url
        self.title = title

    def get_gemini_content(self):
        file = STATIC / self.url[1:] / "index.gmi"
        return (
            bicephalus.Status.OK,
            "text/gemini",
            file.read_text(),
        )

    def get_http_content(self):
        return (
            bicephalus.Status.OK,
            "text/html",
            pretty.pretty_html(
                h.render(
                    h.HTML(
                        h.HEAD(
                            h.TITLE(self.title),
                        ),
                        h.BODY(
                            *html.gemini_to_html(
                                gemtext.parse(self.get_gemini_content()[2])
                            )
                        ),
                    ),
                    {},
                )
            ),
        )


def handler(request: bicephalus.Request) -> bicephalus.Response:  # noqa: PLR0911
    if not request.path.endswith("/"):
        return bicephalus.Response(
            request.path + "/", None, bicephalus.Status.PERMANENT_REDIRECTION
        )
    if request.path == "/":
        return blog_pages.Root(request).response()
    if re.match(r"/\d{4}/\d{2}/.*/", request.path):
        blog_file = blog_pages.CONTENT / (request.path[1:-1] + ".gmi")
        if blog_file.exists():
            return blog_pages.EntryPage(request, blog_file).response()
    if request.path == "/feed/" and request.proto == bicephalus.Proto.HTTP:
        return blog_pages.Root(request).feed()
    if request.path == "/about/":
        return SimplePage(request, request.path, "About Álex Córcoles").response()
    if request.path == "/laspelis/":
        return SimplePage(request, request.path, "laspelis").response()
    if re.match(r"/laspelis/\d+/", request.path):
        return SimplePage(
            request, request.path.removesuffix("/") + "/", request.path
        ).response()

    return page.NotFound(request).response()
