from flask import Blueprint, jsonify, request
from database.database import Database
from utils.utils import sanitize

search_bp = Blueprint("search", __name__)

@search_bp.route("/search", methods=["POST"])
def search_results():
    """
    Return the most similar search results

    This is the main route that displays a subsection of each search topic
    """
    data = request.get_json()
    query = sanitize(data["query"])

    # Create the connection to the database
    db = Database()
    db.create_connection()

    # Get the most accurate search results
    # 3 categories
    categories = db.fetchall("""
                    SELECT bm25(category_fts) AS score, c.category_id, c.category_name
                    FROM categories AS c
                    INNER JOIN category_fts AS f ON c.category_id = f.category_id
                    WHERE f.category_name LIKE '%' || ? || '%'
                    ORDER BY score ASC
                    LIMIT 3;
        """, (query,))
    
    # 3 users
    users = db.fetchall("""
                    SELECT bm25(user_fts) AS score, u.user_id, u.username, u.is_live
                    FROM users AS u
                    INNER JOIN user_fts AS f ON u.user_id = f.user_id
                    WHERE f.username LIKE '%' || ? || '%'
                    ORDER BY score ASC
                    LIMIT 3;
        """, (query,))

    # 3 streams
    streams = db.fetchall("""
                    SELECT bm25(stream_fts) AS score, s.user_id, s.title, s.num_viewers, c.category_name, u.username
                    FROM streams AS s
                    INNER JOIN stream_fts AS f ON s.user_id = f.user_id
                    INNER JOIN users AS u ON s.user_id = u.user_id
                    INNER JOIN categories AS c ON s.category_id = c.category_id
                    WHERE f.title LIKE '%' || ? || '%'
                    ORDER BY score ASC
                    LIMIT 3;
        """, (query,))

    db.close_connection()

    print(query, streams, users, categories, flush=True)
    
    return jsonify({"streams": streams, "categories": categories, "users": users})

@search_bp.route("/search/categories", methods=["GET", "POST"])
def search_categories():
    """
    Display all the results for categories from the specified user query
    """
    # Receive the query data from the user
    data = request.get_json()
    query = sanitize(data["query"])

	# Create the connection to the database
    db = Database()
    db.create_connection()

    # Fetch the ranked data and send to JSON to be displayed
    categories = db.fetchall("""
                    SELECT bm25(category_fts) AS score, c.category_id, c.category_name
                    FROM categories AS c
                    INNER JOIN category_fts AS f ON c.category_id = f.category_id
                    WHERE f.category_name LIKE '%' || ? || '%'
                    ORDER BY score ASC;
        """, (query,))
    
    db.close_connection()
    
    return jsonify({"categories": categories})

@search_bp.route("/search/users", methods=["GET", "POST"])
def search_users():
    """
    Display all the results for users from the specified user query
    """
    # Receive the query data from the user
    data = request.get_json()
    query = sanitize(data["query"])

	# Create the connection to the database
    db = Database()
    db.create_connection()
    
    # Fetch the ranked data and send to JSON to be displayed
    users = db.fetchall("""
                    SELECT bm25(user_fts) AS score, u.user_id, u.username, u.is_live
                    FROM users AS u
                    INNER JOIN user_fts AS f ON u.user_id = f.user_id
                    WHERE f.username LIKE '%' || ? || '%'
                    ORDER BY score ASC;
        """, (query,))
    
    db.close_connection()

    return jsonify({"users": users})


@search_bp.route("/search/streams", methods=["GET", "POST"])
def search_streams():
    """
    Display all the results for streams from the specified user query
    """
    # Receive the query data from the user
    data = request.get_json()
    query = sanitize(data["query"])

	# Create the connection to the database
    db = Database()
    db.create_connection()
    
    # Fetch the ranked data and send to JSON to be displayed
    streams = db.fetchall("""
                    SELECT bm25(stream_fts) AS score, s.user_id, s.title, s.num_viewers, s.category_id, u.username
                    FROM streams AS s
                    INNER JOIN stream_fts AS f ON s.user_id = f.user_id
                    INNER JOIN users AS u ON s.user_id = u.user_id
                    WHERE f.title LIKE '%' || ? || '%'
                    ORDER BY score ASC;
        """, (query,))

    db.close_connection()

    return jsonify({"streams": streams})