from flask import request, jsonify
from db_config import get_db_connection

def get_friends():
    user_id = request.args.get("user_id")
    filter_by = request.args.get("filter", "all")
    if not user_id:
        return jsonify({"error": "Missing user_id"}), 400

    try:
        conn = get_db_connection()
        cursor = conn.cursor(dictionary=True)

        query = """
            SELECT f.id, f.user_id_1, f.user_id_2, f.status,
                CASE
                    WHEN f.user_id_1 = %s THEN u2.username
                    ELSE u1.username
                END AS friend_username,
                CASE
                    WHEN f.user_id_1 = %s THEN u2.display_name
                    ELSE u1.display_name
                END AS friend_display
            FROM friendships f
            JOIN users u1 ON u1.id = f.user_id_1
            JOIN users u2 ON u2.id = f.user_id_2
            WHERE (f.user_id_1 = %s OR f.user_id_2 = %s)
        """

        values = [user_id, user_id, user_id, user_id]

        if filter_by in ["accepted", "pending", "blocked"]:
            query += " AND f.status = %s"
            values.append(filter_by)

        cursor.execute(query, values)
        results = cursor.fetchall()

        cursor.close()
        conn.close()
        return jsonify(results)

    except Exception as e:
        return jsonify({"error": str(e)}), 500

def send_friend_request():
    data = request.json
    user_id = data.get("user_id")
    friend_id = data.get("friend_id")
    if not user_id or not friend_id:
        return jsonify({"error": "Missing user_id or friend_id"}), 400

    try:
        conn = get_db_connection()
        cursor = conn.cursor()
        cursor.execute("""
            INSERT INTO friendships (user_id_1, user_id_2, status)
            VALUES (%s, %s, 'pending')
            ON DUPLICATE KEY UPDATE status = 'pending'
        """, (min(user_id, friend_id), max(user_id, friend_id)))
        conn.commit()
        cursor.close()
        conn.close()
        return jsonify({"message": "Friend request sent"})
    except Exception as e:
        return jsonify({"error": str(e)}), 500

def accept_friend_request():
    data = request.json
    user_id = data.get("user_id")
    friend_id = data.get("friend_id")
    if not user_id or not friend_id:
        return jsonify({"error": "Missing user_id or friend_id"}), 400

    try:
        conn = get_db_connection()
        cursor = conn.cursor()
        cursor.execute("""
            UPDATE friendships SET status = 'accepted'
            WHERE user_id_1 = %s AND user_id_2 = %s
               OR user_id_1 = %s AND user_id_2 = %s
        """, (user_id, friend_id, friend_id, user_id))
        conn.commit()
        cursor.close()
        conn.close()
        return jsonify({"message": "Friend request accepted"})
    except Exception as e:
        return jsonify({"error": str(e)}), 500

def block_friend():
    data = request.json
    user_id = data.get("user_id")
    friend_id = data.get("friend_id")
    if not user_id or not friend_id:
        return jsonify({"error": "Missing user_id or friend_id"}), 400

    try:
        conn = get_db_connection()
        cursor = conn.cursor()
        cursor.execute("""
            INSERT INTO friendships (user_id_1, user_id_2, status)
            VALUES (%s, %s, 'blocked')
            ON DUPLICATE KEY UPDATE status = 'blocked'
        """, (min(user_id, friend_id), max(user_id, friend_id)))
        conn.commit()
        cursor.close()
        conn.close()
        return jsonify({"message": "User blocked"})
    except Exception as e:
        return jsonify({"error": str(e)}), 500

def remove_friend():
    data = request.json
    user_id = data.get("user_id")
    friend_id = data.get("friend_id")
    if not user_id or not friend_id:
        return jsonify({"error": "Missing user_id or friend_id"}), 400

    try:
        conn = get_db_connection()
        cursor = conn.cursor()
        cursor.execute("""
            DELETE FROM friendships
            WHERE (user_id_1 = %s AND user_id_2 = %s)
               OR (user_id_1 = %s AND user_id_2 = %s)
        """, (user_id, friend_id, friend_id, user_id))
        conn.commit()
        cursor.close()
        conn.close()
        return jsonify({"message": "Friendship removed"})
    except Exception as e:
        return jsonify({"error": str(e)}), 500
