from fastapi import FastAPI
from contextlib import asynccontextmanager
from fastapi.staticfiles import StaticFiles

from app.controllers.route_to_web import RouteToWeb
from app.services.markdown_processor import MarkdownProcessor
from app.services.metadata_processor import MetadataProcessor
from app.controllers.category_controller import CategoryController
from fastapi.middleware.gzip import GZipMiddleware
from app.services.image_service import ImageService


class Application:
    def __init__(self):
        """Initialize the FastAPI app and configure it."""
        self.app = FastAPI( lifespan = self._lifespan_event )
        self._set_image_sizes()
        self._setup_static_files()
        self._include_routers()
        self._include_middelware()




    @asynccontextmanager
    async def _lifespan_event(self, app: FastAPI):
        """Lifespan event for startup and shutdown logic."""
        print("App startup: Processing Markdown files...")
        # Generate dynamic JSON data
        metadata_processor = MetadataProcessor(input_dir="./data", output_file="generated_data.json",app=self.app)
        metadata_processor.generate_json()
        print("Generated dynamic data file.")
        # Process Markdown files into HTML
        processor = MarkdownProcessor(input_dir="./data", templates_dir="./templates",app=self.app)
        processor.run()
        yield
        print("App shutdown: Cleanup complete.")

    def _setup_static_files(self):
        """Mount static file directories."""
        self.app.mount("/data", StaticFiles(directory="data"), name="data")
        self.app.mount("/static", StaticFiles(directory="static"), name="static")
        self.app.mount( "/images", StaticFiles( directory = "static/images" ), name = "images" )

    def _include_routers(self):
        """Include all route controllers."""
        category_controller = CategoryController()
        image_service = ImageService(self.app)
        route_to_web = RouteToWeb(self.app)

        self.app.include_router( category_controller.router )
        self.app.include_router(route_to_web.router)
        self.app.include_router( image_service.router )


    def _include_middelware(self):
        self.app.add_middleware( GZipMiddleware, minimum_size = 500 )

    def _set_image_sizes(self):
        self.app.state.IMAGE_SIZES = {
            'thumbnails': {'width': 150, 'height': 150},
            'large': {'width': 800, 'height': 600},
            'small': {'width': 300, 'height': 300},
            'original': {'width': None, 'height': None},  # Original størrelse
        }

    def get_app(self):
        """Return the FastAPI app instance."""
        return self.app


application = Application()
app = application.get_app()
