import uvicorn

from fastapi.middleware.cors import CORSMiddleware
from fastapi.exceptions import HTTPException

from middlewares.token_middleware import AuthHeaderMiddleware
from application.create_file import create_app
from handlers_exception import (
    exception_handler_http,
    exception_handler_exception,
)
from prometheus_fastapi_instrumentator import Instrumentator
import routers

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)

app.add_exception_handler(HTTPException, exception_handler_http)
app.add_exception_handler(Exception, 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()
