# endpoints/list_members.py
from flask import Blueprint, request, jsonify
from neo4j import GraphDatabase
from app import get_driver, neo4j_logger

bp = Blueprint('list_members', __name__)

@bp.route('/list_members', methods=['GET'])
@bp.route('/list_members', methods=['GET'])
def list_members():
    member_name = request.args.get('member_name')

    if not member_name:
        return jsonify({"error": "No member name provided"}), 400

    driver = get_driver()

    try:
        with driver.session() as session:
            result = session.run("""
                MATCH (m:Person {name: $memberName})-[*]-(n)
                WITH m, n, COLLECT(DISTINCT (m)-[r]->(n)) AS rels
                RETURN {
                    nodes: [
                        m,
                        n
                    ],
                    links: [
                        UNWIND rels AS rel
                        RETURN {
                            source: startNode(rel).id,
                            target: endNode(rel).id,
                            type: type(rel)
                        }
                    ]
                }
            """, memberName=member_name)

            record = result.single()

            if not record:
                return jsonify({"error": "No data found for the provided member name"}), 404

            # Extract nodes and links from the returned record
            nodes_data = []
            links_data = []

            nodes_record = record['nodes']
            links_record = record['links']

            # Process nodes
            for node in nodes_record:
                nodes_data.append({
                    "id": node.id,
                    "label": list(node.labels)[0] if node.labels else "",
                    "name": node.get("name", "")
                })

            # Process links
            for link in links_record:
                links_data.append({
                    "source": link['source'],
                    "target": link['target'],
                    "type": link['type']
                })

            data = {
                "nodes": nodes_data,
                "links": links_data
            }

            return jsonify(data)

    except Exception as e:
        neo4j_logger.error(f"Error querying Neo4j: {e}")
        return jsonify({"error": str(e)}), 500

@bp.route('/get_member_names', methods=['GET'])
def get_member_names():
    driver = get_driver()

    try:
        with driver.session() as session:
            result = session.run("MATCH (p:Person) RETURN p.name AS name")
            members = [record['name'] for record in result]
            return jsonify(members)

    except Exception as e:
        neo4j_logger.error(f"Error fetching member names: {e}")
        return jsonify({"error": str(e)}), 500