from flask import Blueprint, request, Response
from app.core.response import build_response
from app.services.items_services import (
    add_item_service,
    delete_item_service,
    get_item_details_service,
    list_items_service,
    update_item_service,
    get_item_options_service,
)
from app.core.security import require_jwt


item_routes = Blueprint('item_routes', __name__)


# Adds an item to the item table and its original table
@item_routes.route('/add_item/<string:model_name>/', methods=['POST'])
@require_jwt()
def add_item(model_name: str) -> Response:
    data = request.json

    response, status_codes = add_item_service(
        model_name=model_name, item_data=data)
    return build_response(
        data=response,
        status_codes=status_codes
    )


# Retrieves all items from their original table
@item_routes.route('/list_items/<string:model_name>/', methods=['POST'])
@require_jwt()
def list_items(model_name: str) -> Response:
    data = request.json
    response, status_codes = list_items_service(
        model_name=model_name, filters=data)
    return build_response(
        data=response,
        status_codes=status_codes
    )


# Retrieves details for a certain item using their id in the items table
@item_routes.route('/get_item_details/<int:id>/', methods=['GET'])
@require_jwt()
def get_item_details(id: int) -> Response:
    response, status_codes = get_item_details_service(id=id)
    return build_response(
        data=response,
        status_codes=status_codes
    )


# Updates columns for an item in their original table
@item_routes.route('/update_item/<int:id>/', methods=['PUT'])
@require_jwt()
def update_item(id: int) -> Response:
    data = request.json

    response, status_codes = update_item_service(id=id, item_data=data)
    return build_response(
        data=response,
        status_codes=status_codes
    )


# Deletes an item from their original table and the items table
@item_routes.route('/delete_item/<int:id>/', methods=['DELETE'])
@require_jwt()
def delete_item(id: int) -> Response:
    response, status_codes = delete_item_service(id=id)
    return build_response(
        data=response,
        status_codes=status_codes
    )


# Returns all item ids mapped to the relevant data in the items original table
@item_routes.route('/get_item_options/', methods=['GET'])
@require_jwt()
def get_item_options() -> Response:
    response, status_codes = get_item_options_service()
    return build_response(
        data=response,
        status_codes=status_codes
    )
