from flask import Blueprint, request, session
from werkzeug.exceptions import NotFound, BadRequest
from services.user import UserService
from schemas.user import user_schema, list_schema, update_user_schema, new_user_schema


user_controller = Blueprint("user", __name__, url_prefix="/users")


@user_controller.get("")
def list_users():
    return list_schema.dump(UserService.list_users()), 200


@user_controller.post("")
def create_user():
    data = new_user_schema.load(request.get_json())
    return user_schema.dump(UserService.create_user(**data)), 201


@user_controller.get("/<int:user_id>")
def get_user(user_id: int):
    result = UserService.get_user_by_id(user_id)
    if not result:
        raise NotFound("User not found")
    
    return user_schema.dump(result), 200


@user_controller.put("/<int:user_id>")
def update_user(user_id: int):
    data = update_user_schema.load(request.get_json())
    result = UserService.update_user(user_id, **data)
    if not result:
        raise NotFound("User not found")
    return user_schema.dump(result), 200


@user_controller.delete("/<int:user_id>")
def delete_user(user_id: int):
    result, message = UserService.delete_user(user_id)
    if not result:
        raise BadRequest(message)
    return {"message": message}, 200


@user_controller.post("/login")
def login_user():
    data = request.get_json()
    result = UserService.login_user(**data)
    if not result:
        raise BadRequest("Invalid credentials")
    session["user_id"] = result.id
    return user_schema.dump(result), 200
