from flask import Blueprint, request, jsonify
from utils.helpers.db_helper import execute_query

api_activity_location_bp = Blueprint("api_activity_location", __name__)

ACTIVITY_LOCATION_FIELDS = [
    "state",
    "district",
    "block",
    "sector",
    "centre",
    "panchayat_name",
    "school_name",
    "activity_level",
    "peeo_uceeo_school",
]


def validate_level(level):
    """Validate the level parameter from the request."""
    if not level:
        return {"error": "Missing level parameter"}, 400
    if level not in ACTIVITY_LOCATION_FIELDS:
        return {"error": "Invalid level parameter"}, 400
    return None


def build_query_and_values(level, request_args):
    """Build the SQL query and values based on the request arguments."""
    filters = []
    values = []

    for key in ACTIVITY_LOCATION_FIELDS:
        val = request_args.get(key)
        if val:
            filters.append(f"{key} = %s")
            values.append(val)

    if filters:
        where_clause = " AND ".join(filters)
        query = f"SELECT DISTINCT {level} FROM activities_data WHERE {where_clause} ORDER BY {level}"
    else:
        query = f"SELECT DISTINCT {level} FROM activities_data ORDER BY {level}"

    return query, values


def error_response(message, status_code):
    """Returns a standardized error response."""
    return jsonify({"Error": message}), status_code


@api_activity_location_bp.route("/api/activity_location", methods=["GET"])
def get_activity_location_values():
    """API endpoint to get distinct values for a specific activity location level."""
    level = request.args.get("level")

    # Validate level parameter
    validation_error = validate_level(level)
    if validation_error:
        return jsonify(validation_error[0]), validation_error[1]

    # Build query and values
    query, values = build_query_and_values(level, request.args)

    # Execute query and fetch results
    try:
        options = execute_query(query, values)
    except Exception as e:
        return error_response(f"Internal server error. {e}", 500)

    return jsonify(options)
