from astrbot.core.log import LogManager

from .local_strategy import LocalRenderStrategy
from .network_strategy import NetworkRenderStrategy

logger = LogManager.GetLogger(log_name="astrbot")


class HtmlRenderer:
    def __init__(self, endpoint_url: str | None = None) -> None:
        self.network_strategy = NetworkRenderStrategy(endpoint_url)
        self.local_strategy = LocalRenderStrategy()

    async def initialize(self) -> None:
        await self.network_strategy.initialize()

    async def render_custom_template(
        self,
        tmpl_str: str,
        tmpl_data: dict,
        return_url: bool = False,
        options: dict | None = None,
    ):
        """使用自定义文转图模板。该方法会通过网络调用 t2i 终结点图文渲染API。
        @param tmpl_str: HTML Jinja2 模板。
        @param tmpl_data: jinja2 模板数据。
        @param options: 渲染选项。

        @return: 图片 URL 或者文件路径，取决于 return_url 参数。

        @example: 参见 https://docs.astrbot.app 插件开发部分。
        """
        return await self.network_strategy.render_custom_template(
            tmpl_str,
            tmpl_data,
            return_url,
            options,
        )

    async def render_t2i(
        self,
        text: str,
        use_network: bool = True,
        return_url: bool = False,
        template_name: str | None = None,
    ):
        """使用默认文转图模板。"""
        if use_network:
            try:
                return await self.network_strategy.render(
                    text,
                    return_url=return_url,
                    template_name=template_name,
                )
            except BaseException as e:
                logger.error(
                    f"Failed to render image via AstrBot API: {e}. Falling back to local rendering.",
                )
                return await self.local_strategy.render(text)
        else:
            return await self.local_strategy.render(text)
