import json
from collections import defaultdict

def remove_duplicates(records):
    # 使用字典分组：key 为 (type, name)
    grouped = defaultdict(list)
    
    for record in records:
        t = record.get("type")
        n = record.get("name")
        if t is not None and n is not None:
            grouped[(t, n)].append(record)
        else:
            # 如果 type 或 name 缺失，直接保留（不参与去重）
            continue

    result = []

    for key, items in grouped.items():
        if len(items) == 1:
            result.append(items[0])
        else:
            # 多条重复，需要筛选
            # 优先：保留 attributes 中 "名称" 存在的记录
            valid_items = [item for item in items if item.get("attributes", {}).get("名称")]
            
            if not valid_items:
                # 如果都没有 "名称"，则从所有中选字段最多的
                candidates = items
            else:
                candidates = valid_items

            # 从 candidates 中选择 attributes 非空字段最多的
            best_record = max(candidates, key=lambda x: count_non_empty_attributes(x))
            result.append(best_record)

    # 添加未被分组的（type/name 缺失的）原始记录
    for record in records:
        t = record.get("type")
        n = record.get("name")
        if t is None or n is None:
            result.append(record)

    return result

def count_non_empty_attributes(record):
    attrs = record.get("attributes", {})
    if not isinstance(attrs, dict):
        return 0
    # 统计非空、非None、非空字符串的字段数量
    return sum(1 for v in attrs.values() if v not in [None, "", ""])


def deduplicate_relationships(relationships):
    """
    对 relationships 列表进行去重，基于 type、from_entity 和 to_entity 三个字段。

    参数:
        relationships (list of dict): 包含关系记录的列表，每条记录为字典，
                                      至少包含 'type', 'from_entity', 'to_entity' 三个键。

    返回:
        list of dict: 去重后的列表，保留首次出现的记录。
    """
    seen = set()
    unique_relationships = []

    for rel in relationships:
        # 构造一个不可变的元组作为唯一标识
        key = (rel['type'], rel['from_entity'], rel['to_entity'])
        if key not in seen:
            seen.add(key)
            unique_relationships.append(rel)

    return unique_relationships
