import os
import json
from fastapi import APIRouter, Request
from fastapi.responses import HTMLResponse, Response
from fastapi.templating import Jinja2Templates

class DynamicController:
    def __init__(self, data_dir: str):
        """Initialize the dynamic controller."""
        self.router = APIRouter()
        self.templates = Jinja2Templates(directory="templates")
        self.data_dir = data_dir
        self.data = self._load_mock_data()
        self._add_dynamic_routes()

    def _load_mock_data(self):
        """Load mock data from a JSON file."""
        with open("generated_data.json") as file:
            return json.load(file)

    def _add_dynamic_routes(self):
        """Scan data directory and create dynamic routes."""
        for root, dirs, files in os.walk(self.data_dir):
            for directory in dirs:
                route_path = f"/{directory}"  # Create route based on directory name
                directory_path = os.path.join(root, directory)

                # Register route dynamically
                self.router.add_api_route(
                    route_path,
                    self._serve_dynamic_template(directory, directory_path),
                    methods=["GET"],
                    response_class=HTMLResponse,
                )

    def _serve_dynamic_template(self, route_name: str, directory_path: str):
        """Closure to serve templates for each route."""

        async def route_handler(request: Request):
            # Look for index.html or render fallback content
            index_html = os.path.join(directory_path, "index.html")
            if os.path.exists(index_html):
                with open(index_html, "r", encoding="utf-8") as file:
                    content = file.read()
                # Find the author for this route from preloaded data
                for category in self.data.get("categories", []):
                    if category["path"] == route_name:
                        author_name = category["author"]
                        break
                # Pass required data to the template
                return self.templates.TemplateResponse(
                    "category.html",
                    {
                        "request": request,
                        "page_title": route_name.capitalize(),
                        "content": content,
                        "author": author_name,
                        "data": self.data,  # Pass additional data if needed
                    },
                )

            # Fallback: Return a 404 if no content is found
            return Response(f"No content found for {route_name}", status_code=404)
        return route_handler
