import json
import random

from fastapi import APIRouter, Request, FastAPI
from fastapi.templating import Jinja2Templates
from app.controllers.category_controller import CategoryController

class RouteToWeb:
	def __init__(self, app: FastAPI):
		"""Initialize the controller."""
		self.router = APIRouter()
		self.templates = Jinja2Templates(directory="templates")
		self.app = app
		self.category_controller = CategoryController()
		self._add_routes()
		self._add_global_middleware()

	def _add_routes(self):
		"""Add routes to the router."""
		@self.router.get("/route-list", tags=["system"])
		async def route_list(request: Request):
			"""Render route list with categories."""
			routes = [
				{"path": route.path, "name": route.name or "Unnamed"}
				for route in self.app.routes
			]
			categories = request.state.categories
			return self.templates.TemplateResponse(
				"route_list.html",
				{"request": request, "routes": routes, "categories": categories, "page_title": "Route og Kategori Liste"},
			)



	def _add_global_middleware(self):
		"""Middleware to add categories and next category globally to all requests."""

		@self.app.middleware( "http" )
		async def add_categories_to_request(request: Request, call_next):
			def generate_dynamic_description(category_name: str) -> str:
				"""Generate a dynamic and engaging link text for a category."""
				templates = [
					"Dyk ned i kategorien {category} og bliv inspireret!",
					"Opdag alt, hvad du behøver at vide i kategorien {category}.",
					"Udforsk {category}-kategorien og find noget nyt og spændende.",
					"Lad dig fordybe i kategorien {category} – der er meget at se!",
					"Find din næste læseoplevelse i {category}-kategorien.",
					"Gå på opdagelse i kategorien {category} og bliv klogere.",
					"Der venter spændende indhold i {category}-kategorien – klik her!",
					"Vil du vide mere? Hele kategorien {category} er kun ét klik væk.",
					"Læs videre i kategorien {category} og få ny inspiration.",
					"Fordyb dig i {category}-kategorien og opdag nyt indhold.",
					"Spring ind i {category}-kategorien og gå på opdagelse!",
					"Find masser af viden og gode læseoplevelser i {category}-kategorien.",
					"Udforsk hele kategorien {category} og bliv beriget med ny viden.",
					"Der er mere at læse i {category}-kategorien – gå ikke glip af det!",
					"Tag et dybere kig i kategorien {category} og bliv inspireret!"
				]
				template = random.choice( templates )
				return template.format( category = category_name.lower() )
			"""Inject categories and next category into request.state globally."""
			# Hent kategorier direkte fra CategoryController
			categories_response = await self.category_controller.list_categories( request )
			categories_data = categories_response.body.decode()
			categories = json.loads( categories_data )

			# Tilføj kategorier til request.state
			request.state.categories = categories

			# Find den aktuelle og næste kategori
			current_path = request.url.path.split("/")[-1]
			next_category = None
			for index, category in enumerate( categories ):
				if category["path"] == current_path:
					# Find næste kategori (cirkulær, hvis det er den sidste)
					next_index = (index + 1) % len( categories )
					next_category = categories[next_index]
					next_category["description"] = generate_dynamic_description( next_category["path"] )

					break

			# Tilføj næste kategori til request.state
			request.state.next_category = next_category

			response = await call_next( request )
			return response
