"""实体仓储模块

本模块提供实体节点的数据访问功能。

Classes:
    EntityRepository: 实体仓储，管理ExtractedEntityNode的CRUD操作
"""

from typing import List, Dict
from datetime import datetime

from app.repositories.neo4j.base_neo4j_repository import BaseNeo4jRepository
from app.core.memory.models.graph_models import ExtractedEntityNode
from app.repositories.neo4j.neo4j_connector import Neo4jConnector


class EntityRepository(BaseNeo4jRepository[ExtractedEntityNode]):
    """实体仓储
    
    管理实体节点的创建、查询、更新和删除操作。
    提供按类型、名称、向量相似度等条件查询实体的方法。
    
    Attributes:
        connector: Neo4j连接器实例
        node_label: 节点标签，固定为"ExtractedEntity"
    """
    
    def __init__(self, connector: Neo4jConnector):
        """初始化实体仓储
        
        Args:
            connector: Neo4j连接器实例
        """
        super().__init__(connector, "ExtractedEntity")
    
    def _map_to_entity(self, node_data: Dict) -> ExtractedEntityNode:
        """将节点数据映射为实体对象
        
        Args:
            node_data: 从Neo4j查询返回的节点数据字典
            
        Returns:
            ExtractedEntityNode: 实体对象
        """
        # 从查询结果中提取节点数据
        n = node_data.get('n', node_data)
        
        # 处理datetime字段
        if isinstance(n.get('created_at'), str):
            n['created_at'] = datetime.fromisoformat(n['created_at'])
        if n.get('expired_at') and isinstance(n.get('expired_at'), str):
            n['expired_at'] = datetime.fromisoformat(n['expired_at'])
        
        # 确保aliases字段存在且为列表
        if 'aliases' not in n or n['aliases'] is None:
            n['aliases'] = []
        
        # 处理 ACT-R 属性 - 确保字段存在且有默认值
        n['importance_score'] = n.get('importance_score', 0.5)
        n['activation_value'] = n.get('activation_value')
        n['access_history'] = n.get('access_history') or []
        n['last_access_time'] = n.get('last_access_time')
        n['access_count'] = n.get('access_count', 0)
        
        return ExtractedEntityNode(**n)
    
    async def find_by_type(self, entity_type: str, limit: int = 100) -> List[ExtractedEntityNode]:
        """根据实体类型查询
        
        Args:
            entity_type: 实体类型（如"Person", "Organization"等）
            limit: 返回结果的最大数量
            
        Returns:
            List[ExtractedEntityNode]: 实体列表
        """
        return await self.find({"entity_type": entity_type}, limit=limit)
    

