import uvicorn
import routers

from fastapi.middleware.cors import CORSMiddleware
from fastapi import Request, HTTPException, status
from fastapi.responses import JSONResponse

from middlewares.token_middleware import AuthHeaderMiddleware
from application.create_file import create_app
from api_objects.errors.errors_dictionary import ErrorHandlers
from prometheus_fastapi_instrumentator import Instrumentator

app = create_app(routers=routers)
Instrumentator().instrument(app=app).expose(app=app)

app.add_middleware(
    CORSMiddleware,
    **{
        "allow_origins": ["*"],
        "allow_credentials": True,
        "allow_methods": ["*"],
        "allow_headers": ["*"],
    },
)
app.add_middleware(AuthHeaderMiddleware)

# Initialize error handlers
error_handlers = ErrorHandlers.create(
    requests=Request,
    exceptions=HTTPException,
    response_model=JSONResponse,
    status=status
)

# Register error handlers with bound methods
app.add_exception_handler(HTTPException, error_handlers.exception_handler_http)
app.add_exception_handler(Exception, error_handlers.exception_handler_exception)

if __name__ == "__main__":
    uvicorn_config = {
        "app": "app:app",
        "host": "0.0.0.0",
        "port": 41575,
        "log_level": "info",
        "reload": True,
    }
    uvicorn.Server(uvicorn.Config(**uvicorn_config)).run()
