from logger import setup_logging
setup_logging()

import const
from uvicorn_loguru_integration import run_uvicorn_loguru

import time
from starlette.middleware.base import BaseHTTPMiddleware

import middleware

from routers.v1 import user, server, peer, wg
import script.wireguard_startup
import pkg_resources
import uvicorn as uvicorn
from fastapi.staticfiles import StaticFiles

from starlette.responses import FileResponse
from fastapi import Depends, FastAPI
import database.util

app = FastAPI()
app.add_middleware(BaseHTTPMiddleware, dispatch=middleware.db_session_middleware)
app.add_middleware(BaseHTTPMiddleware, dispatch=middleware.logging_middleware)

app.include_router(
    user.router,
    prefix="/api/v1",
    tags=["user"],
    dependencies=[],
    responses={404: {"description": "Not found"}}
)


app.include_router(
    server.router,
    prefix="/api/v1/server",
    tags=["server"],
    dependencies=[Depends(middleware.auth)],
    responses={404: {"description": "Not found"}}
)


app.include_router(
    peer.router,
    prefix="/api/v1/peer",
    tags=["peer"],
    dependencies=[Depends(middleware.auth)],
    responses={404: {"description": "Not found"}}
)


app.include_router(
    wg.router,
    prefix="/api/v1/wg",
    tags=["wg"],
    dependencies=[Depends(middleware.auth)],
    responses={404: {"description": "Not found"}}
)


@app.get("/", include_in_schema=True)
def root():
    return FileResponse('build/index.html')


app.mount("/", StaticFiles(directory=pkg_resources.resource_filename(__name__, 'build')), name="static")


def main():
    # Sleep the wait timer.
    time.sleep(const.INIT_SLEEP)

    # Ensure database existence
    database.util.setup_initial_database()

    # Perform Migrations
    database.util.perform_migrations()

    # Configure wireguard
    script.wireguard_startup.setup_on_start()


@app.on_event("startup")
async def startup():
    if __name__ != "__main__":
        main()


@app.on_event("shutdown")
async def shutdown():
    pass


if __name__ == "__main__":

    main()

    run_uvicorn_loguru(
        uvicorn.Config(
            "__main__:app",
            host="0.0.0.0",
            port=8000,
            log_level="warning",
            reload=True,
            workers=1
        )
    )