from fastapi import FastAPI, Request, Response
from src.repo.engine import engine, Base
from dotenv import load_dotenv
from fastapi.staticfiles import StaticFiles
import os
#import logging
from src.middleware.cors_middleware import setup_cors
#from starlette.middleware.base import BaseHTTPMiddleware
from src.router.TestTableRouter import TestTableRouter
from src.router.project.routes import ProjectRouter
from src.router.member.routes import MemberRouter
from src.router.module.routes import ModuleRouter
from src.router.task.routes import TaskRouter
from src.router.users.routes import UsersRouter

testTableRouter = TestTableRouter()
projectRouter=ProjectRouter()
memberRouter=MemberRouter()
moduleRouter=ModuleRouter()
taskRouter=TaskRouter()
userRouter=UsersRouter()

try:
    directory_path = os.path.join("uploads")
    os.makedirs(directory_path, exist_ok=True)
except OSError as e:
    print(f"Error creating directory '{directory_path}': {e}")
"""
logging.basicConfig(
    filename="app.log",
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s",
)
#logger = logging.getLogger(__name__)

#
class LoggingMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request: Request, call_next):
        # Log request details
        client_ip = request.client.host  # type: ignore
        method = request.method
        url = request.url.path

        #logger.info(f"Request: {method} {url} from {client_ip}")

        try:
            # Process the request
            response = await call_next(request)
            # Log response details
            status_code = response.status_code
            #logger.info(f"Response: {method} {url} returned {status_code} to {client_ip}")
            return response
        except Exception as e:
            # you probably want some kind of logging here
           # logger.info(f" Exception {e}")
            return Response(f"Internal server error {e}", status_code=500)
"""

app = FastAPI(title=os.getenv("APP_NAME"),
    description=os.getenv("APP_DESCRIPTION"),
    version="1.0.0")
#app.add_middleware(LoggingMiddleware)
setup_cors(app)

load_dotenv()

app.mount("/uploads", StaticFiles(directory="uploads"), name="uploads")
#app.include_router(testTableRouter.router)

@app.on_event("startup")
async def startup_event():
    async with engine.begin() as conn:
        await conn.run_sync(Base.metadata.create_all)

app.include_router(projectRouter.router, prefix="/project", tags=["Project"])
app.include_router(memberRouter.router, prefix="/project", tags=["Member"])
app.include_router(moduleRouter.router, prefix="/project", tags=["Module"])
app.include_router(taskRouter.router, prefix="/project", tags=["Task"])
app.include_router(userRouter.router, prefix="/project", tags=["User"])

@app.get("/")
async def root():
    return {"App": os.getenv("APP_NAME")}
