from fastapi import APIRouter, Form, UploadFile, File, Depends, Query
from sqlalchemy.ext.asyncio import AsyncSession

from src.database import get_db
from src.user.dependencies import get_current_user
from src.user.models import User
from src.user.schemas import UserResponse, UserCreate, UserResponseID, UserResponseWrapper, UserMeResponse
from src.user.service import UserService

router = APIRouter(prefix="/user", tags=["User"])


@router.get("/allRole")
async def get_all_roles(db: AsyncSession = Depends(get_db)):
    return await UserService.get_all_roles(db)

@router.get("/me", response_model=UserMeResponse)
async def get_me(current_user: User = Depends(get_current_user)):
    return UserMeResponse(status=True, data=current_user)

@router.post("", response_model=UserResponseWrapper)
async def create_user(
    role_id: int = Form(...),
    name: str = Form(...),
    login: str = Form(...),
    phone: str = Form(...),
    password: str = Form(...),
    logo: UploadFile = File(None),
    db: AsyncSession = Depends(get_db)
):
    return await UserService.create_user(
        db=db,
        name=name,
        login=login,
        phone=phone,
        password=password,
        role_id=role_id,
        logo_file=logo
    )

@router.get("/{user_id}", response_model=UserResponseID)
async def get_user_by_id(
        user_id: int,
        db: AsyncSession = Depends(get_db)
    ):
    user = await UserService.get_user_by_id(user_id, db)
    return {
        "data": user,
        "status": True,
    }

@router.get("")
async def get_user_list(
    needle: str | None = Query(None),
    role_id: int | None = Query(None),
    page: int = 1,
    limit: int = 10,
    db: AsyncSession = Depends(get_db)
):
    result = await UserService.get_user_list(db, needle, role_id, page, limit)
    return {
        **result,
        "status": True
    }

@router.patch("/{user_id}", response_model=UserResponseWrapper)
async def update_user(
    user_id: int,
    name: str | None = Form(None),
    login: str | None = Form(None),
    phone: str | None = Form(None),
    password: str | None = Form(None),
    role_id: int | None = Form(None),
    logo: UploadFile | None = File(None),
    db: AsyncSession = Depends(get_db)
):
    return await UserService.update_user(
        user_id=user_id,
        db=db,
        name=name,
        login=login,
        phone=phone,
        password=password,
        role_id=role_id,
        logo_file=logo
    )


@router.delete("/{user_id}")
async def delete_user(
        user_id: int,
        db: AsyncSession = Depends(get_db)
):
    result = await UserService.delete_user(user_id, db)
    return result


