import asyncio
import os, uuid
from contextlib import asynccontextmanager
from fastapi import FastAPI, UploadFile, File, Depends
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from app.deps import get_current_user
from app.services.scheduler import run_scheduler

from app.routers import auth, users, companies, contracts
from app.routers import vendors, categories, surat, email_inbound, pdf_summarizer, tasks, notifications
from app.routers import permissions, recurring_tasks
from app.routers import leave_requests
from app.routers import telegram_webhook
from app.routers import app_settings
from app.routers import documents as documents_router


@asynccontextmanager
async def lifespan(app):
    task = asyncio.create_task(run_scheduler())
    yield
    task.cancel()
    try:
        await task
    except asyncio.CancelledError:
        pass


app = FastAPI(title="Jarvis API", version="2.0.0", lifespan=lifespan)

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

app.include_router(auth.router,       prefix="/api/v1")
app.include_router(users.router,      prefix="/api/v1")
app.include_router(companies.router,  prefix="/api/v1")
app.include_router(vendors.router,    prefix="/api/v1")
app.include_router(categories.router, prefix="/api/v1")
app.include_router(surat.router,      prefix="/api/v1")
app.include_router(contracts.router,  prefix="/api/v1")
app.include_router(email_inbound.router,   prefix="/api/v1")
app.include_router(pdf_summarizer.router, prefix="/api/v1")
app.include_router(tasks.router,          prefix="/api/v1")
app.include_router(notifications.router,  prefix="/api/v1")
app.include_router(permissions.router,       prefix="/api/v1")
app.include_router(leave_requests.router,   prefix="/api/v1")
app.include_router(recurring_tasks.router,    prefix="/api/v1")
app.include_router(telegram_webhook.router,  prefix="/api/v1")
app.include_router(app_settings.router,      prefix="/api/v1")
app.include_router(documents_router.router,  prefix="/api/v1")

# Ensure upload dirs exist
for d in ["uploads/contracts", "uploads/bukti", "uploads/surat", "uploads/images", "uploads/incoming", "uploads/borrow", "uploads/comments"]:
    os.makedirs(d, exist_ok=True)

app.mount("/uploads", StaticFiles(directory="uploads"), name="uploads")


@app.post("/api/v1/upload/image")
async def upload_image(
    file: UploadFile = File(...),
    _=Depends(get_current_user),
):
    ext = os.path.splitext(file.filename or "")[1].lower() or ".jpg"
    filename = f"{uuid.uuid4().hex}{ext}"
    path = os.path.join("uploads/images", filename)
    with open(path, "wb") as f:
        f.write(await file.read())
    return {"url": f"/uploads/images/{filename}"}


@app.get("/")
async def root():
    return {"status": "ok", "message": "Jarvis API v2 is running"}
