from flask import Blueprint, Response, request
from app.core.response import build_response
from app.core.security import require_jwt
from app.services.crud_services import (
    add_service,
    get_by_id_service,
    update_service,
    delete_service
)
from app.services.options_services import get_options_service


hub_users_routes = Blueprint('hub_users_routes', __name__)


# Adds a hub user
@hub_users_routes.route('/add_hub_user/', methods=['POST'])
# @require_jwt(roles='super_admin')
def add_hub_user() -> Response:
    data = request.json

    response, status_codes = add_service(model_name='hub_user', item_data=data)
    return build_response(
        data=response,
        status_codes=status_codes
    )


# Returns a list that maps the hub users id to their name
@hub_users_routes.route('/get_hub_user_options/', methods=['GET'])
def get_hub_user_options() -> Response:
    response, status_codes = get_options_service(model_name='hub_user')
    return build_response(
        data=response,
        status_codes=status_codes
    )


# Retrieves info about a certain hub user
@hub_users_routes.route('/get_hub_user_by_id/<int:id>/', methods=['GET'])
@require_jwt(match_id_from_token='id')
def get_hub_user_by_id(id: int) -> Response:
    response, status_codes = get_by_id_service(model_name='hub_user', id=id)
    return build_response(
        data=response,
        status_codes=status_codes
    )


# Updates columns for a certain hub user
@hub_users_routes.route('/update_hub_user/<int:id>/', methods=['PATCH'])
@require_jwt(roles='super_admin')
def update_hub_user(id: int) -> Response:
    data = request.json

    response, status_codes = update_service(
        model_name='hub_user', item_data=data, id=id)
    return build_response(
        data=response,
        status_codes=status_codes
    )


# Deletes a hub user
@hub_users_routes.route('/delete_hub_user/<int:id>/', methods=['DELETE'])
@require_jwt(roles='super_admin')
def delete_hub_user(id: int) -> Response:
    response, status_codes = delete_service(model_name='hub_user', id=id)
    return build_response(
        data=response,
        status_codes=status_codes
    )
