from __future__ import annotations

from typing import TYPE_CHECKING

from sanic_ext.extensions.openapi.builders import SpecificationBuilder

from ..base import Extension
from .blueprint import blueprint_factory


if TYPE_CHECKING:
    from sanic_ext import Extend


class OpenAPIExtension(Extension):
    name = "openapi"

    def startup(self, bootstrap: Extend) -> None:
        if self.app.config.OAS:
            self.bp = blueprint_factory(self.app.config)
            self.app.blueprint(self.bp)
            bootstrap._openapi = SpecificationBuilder()

    def label(self):
        if self.app.config.OAS:
            return self._make_url()

        return ""

    def included(self):
        return self.config.OAS

    def _make_url(self):
        name = f"{self.bp.name}.index"
        _server = (
            None
            if "SERVER_NAME" in self.app.config
            else self.app.serve_location
        ) or None
        _external = bool(_server) or "SERVER_NAME" in self.app.config
        return (
            f"{self.app.url_for(name, _external=_external, _server=_server)}"
        )
