from fastapi import Cookie, Depends, FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse
from fastapi.openapi.docs import get_swagger_ui_html
from fastapi.openapi.utils import get_openapi
from sqlalchemy.orm import Session
from dotenv import load_dotenv
from threading import Thread
from asyncio import run
import os

from db import database, models, crud
from db.database import get_db
from routers import *
from video_capture import handle_cameras

app = FastAPI(docs_url=None, redoc_url=None, openapi_url=None)

# load environment variables
load_dotenv()

origins = [
    os.getenv('WEB_ROOT'),
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"]
)


@app.on_event("startup")
async def on_startup():
    # Database creation
    models.Base.metadata.create_all(bind=database.engine)
    t = Thread(target=run, args=(handle_cameras(),))
    t.start()


# Docs OpenAPI
@app.get("/api/openapi.json")
async def get_open_api_endpoint(connect_id: str = Cookie(...), db: Session = Depends(get_db)):
    user = crud.get_user(connect_id, db)
    if user.admin:
        return JSONResponse(get_openapi(title="FastAPI", version=1, routes=app.routes))


@app.get("/api/docs")
async def get_documentation(connect_id: str = Cookie(...), db: Session = Depends(get_db)):
    user = crud.get_user(connect_id, db)
    if user.admin:
        return get_swagger_ui_html(openapi_url="/api/openapi.json", title="docs")


# Integration of routers
app.include_router(infos.router)
app.include_router(records.router)
app.include_router(stats.router)
app.include_router(news.router)
app.include_router(comments.router)
app.include_router(authentication.router)
app.include_router(websocket.router)