from flask import Blueprint, request, Response
from app.core.response import build_response
from app.services.crud_services import (
    add_service,
    list_service,
    get_by_id_service,
    update_service,
    delete_service
)
from app.services.options_services import get_options_service
from app.core.security import require_jwt


lead_routes = Blueprint('lead_routes', __name__)


# Adds a lead
@lead_routes.route('/add_lead/', methods=['POST'])
@require_jwt()
def add_lead() -> Response:
    data = request.json

    response, status_codes = add_service(model_name='lead', item_data=data)
    return build_response(
        data=response,
        status_codes=status_codes
    )


# Retrieves a list of all leads
@lead_routes.route('/list_leads/', methods=['POST'])
@require_jwt()
def list_leads() -> Response:
    data = request.json

    response, status_codes = list_service(model_name='lead', filters=data)
    return build_response(
        data=response,
        status_codes=status_codes
    )


# Retrieves  all leads columns for a certain leads
@lead_routes.route('/get_lead_by_id/<int:id>/', methods=['GET'])
@require_jwt()
def get_lead_by_id(id: int) -> Response:
    response, status_codes = get_by_id_service(model_name='lead', id=id)
    return build_response(
        data=response,
        status_codes=status_codes
    )


# Updates info about a certain lead
@lead_routes.route('/update_lead/<int:id>/', methods=['PATCH'])
@require_jwt()
def update_lead(id: int) -> Response:
    data = request.json

    response, status_codes = update_service(
        model_name='lead', item_data=data, id=id)
    return build_response(
        data=response,
        status_codes=status_codes
    )


# Deletes a lead from the database
@lead_routes.route('/delete_lead/<int:id>/', methods=['DELETE'])
@require_jwt()
def delete_lead(id: int) -> Response:
    response, status_codes = delete_service(model_name='lead', id=id)
    return build_response(
        data=response,
        status_codes=status_codes
    )


# Returns a list that maps the leads id to their name
@lead_routes.route('/get_lead_options/', methods=['GET'])
def get_lead_options() -> Response:
    response, status_codes = get_options_service(model_name='lead')
    return build_response(
        data=response,
        status_codes=status_codes
    )
