from fastapi import FastAPI, APIRouter, Depends, Request, HTTPException, Form
from fastapi.templating import Jinja2Templates
from fastapi.responses import RedirectResponse, HTMLResponse
from fastapi.responses import JSONResponse
import jwt
from pydantic import BaseModel
from sqlalchemy.future import select
from sqlalchemy.orm import joinedload
from sqlalchemy.ext.asyncio import AsyncSession


from routers.auth import get_current_user
from model.database import get_async_session, Job, Client, AppliedJob, User

router = APIRouter()
templates = Jinja2Templates(directory="templates")

@router.get("/product")
async def product(request: Request, 
                  username: str = Depends(get_current_user),
                  session: AsyncSession = Depends(get_async_session)):
    size = "Work"
    username = username
    
    result = await session.execute(
        select(AppliedJob)
        .options(
            joinedload(AppliedJob.client),  # Подгружаем клиента
            joinedload(AppliedJob.job),  # Подгружаем работу
            joinedload(AppliedJob.users)  # Подгружаем пользователя
        )
    )

    applied_jobs = result.scalars().all()
    
    
    result1 = await session.execute(select(User))
    users = result1.scalars().all()
    
    
    
    
    
    
    return templates.TemplateResponse("product.html", {"request": request, "size": size, 
                                                       "jobs": applied_jobs, "role": username["role"], 
                                                       "username": username['username'], "users": users,
                                                       "current_path": request.url.path })#
    

# Pydantic модель запроса
class StatusUpdate(BaseModel):
    job_id: int
    status: str
    
@router.post("/update_status/")
async def update_status(data: StatusUpdate, 
                        session: AsyncSession = Depends(get_async_session)):
    job = await session.execute(select(AppliedJob).where(AppliedJob.id == data.job_id))
    job = job.scalars().first()

    if not job:
        raise HTTPException(status_code=404, detail="Job not found")

    job.status = data.status
    await session.commit()

    return {"message": "Статус обновлён", "job_id": job.id, "new_status": job.status}



class AssigneeUpdate(BaseModel):
    job_id: int
    assignee_id: int

@router.post("/update_assignee/")
async def update_assignee(data: AssigneeUpdate,
                          session: AsyncSession = Depends(get_async_session)):
    job = await session.execute(select(AppliedJob).where(AppliedJob.id == data.job_id))
    job = job.scalars().first()

    if not job:
        raise HTTPException(status_code=404, detail="Job not found")

    user = await session.execute(select(User).where(User.id == data.assignee_id))
    user = user.scalars().first()

    if not user:
        raise HTTPException(status_code=404, detail="User not found")

    job.assignee = data.assignee_id  # 👈 Убрал _id, чтобы совпадало с моделью
    await session.commit()

    return {"message": "Исполнитель обновлён", "job_id": job.id, "new_assignee": job.assignee}
