a
    ~it                     @   s   d Z ddlmZmZmZmZmZmZ ddlZe	e
ZG dd dZe ZeeddddZeee d	d
dZedddZdS )zi
Event registry with condition-based indexing.

Replaces O(n) event scanning with O(1) filtered lookups.
    )CallableOptionalTupleListDictAnyNc                	   @   sx   e Zd ZdZdd Zdeeeee	e	f  e
e
ee	 ddddZeee d	d
dZe	dddZee dddZdS )EventRegistrya  
    Registry for game events with efficient filtering.

    Events can be registered with conditions:
    - age_range: (min_age, max_age)
    - requires_relationship: bool
    - requires_job: bool
    - day_of_year: int or range

    Usage:
        registry = EventRegistry()
        registry.register("birthday", birthday_event, age_range=(1, 120))

        applicable = registry.get_applicable_events(player)
        for event_info in applicable:
            result = event_info['func'](player, 'check')
    c                 C   s   i | _ i | _g | _d S )N)_events_by_age_no_conditionsself r   //var/www/lichun.app/lichun/ws/event_registry.py__init__    s    zEventRegistry.__init__NF)event_idfunc	age_rangerequires_relationshiprequires_jobday_of_yearreturnc                 C   s   || j v r td| d dS ||||||d| j |< |r`|| jvrPg | j|< | j| | t||||gs|| j| td|  dS )a  
        Register an event with optional conditions.

        Args:
            event_id: Unique event identifier
            func: Event function(player, mode) -> event object
            age_range: (min_age, max_age) tuple
            requires_relationship: Event needs relationships
            requires_job: Event needs player to have a job
            day_of_year: Specific day of year (1-365)
        zEvent z4 already registered, skipping duplicate registrationN)idr   r   r   r   r   zRegistered event: )r	   loggerdebugr
   appendanyr   )r   r   r   r   r   r   r   r   r   r   register'   s"    



zEventRegistry.registerplayerr   c                 C   s   g }|j j}t|dd}tt|dg dk}tt|j dd}| j D ]\}}|\}	}
|	|  krl|
krHn qH|D ]T}||jvrt| j| }|d r|sqt|d r|sqt|d r|d |krqt|	| qtqH| j
D ]}||jvr|	| j|  q|S )	z
        Get events applicable to player's current state.

        Args:
            player: playerClass instance

        Returns:
            List of event info dicts: [{'id', 'func', ...}, ...]
        	dayOfYearNrr   
occupationr   r   r   )cageYearsgetattrlenboolr
   itemseventsr	   r   r   )r   r   Z
applicableZ
player_ageZ
player_dayZhas_relationshipsZhas_jobr   Z	event_idsZmin_agemax_ager   Z
event_infor   r   r   get_applicable_eventsU   s,    




z#EventRegistry.get_applicable_eventsr   c                 C   s
   t | jS )zGet number of registered events)r&   r	   r   r   r   r   count~   s    zEventRegistry.countc                 C   s   t | j S )zList all registered event IDs)listr	   keysr   r   r   r   list_events   s    zEventRegistry.list_events)NFFN)__name__
__module____qualname____doc__r   strr   r   r   intr'   r   r   r   dictr+   r-   r0   r   r   r   r   r      s$       .)r   )r   r   r   c                 K   s   t j| |fi | dS )z(Register an event in the global registryN)	_registryr   )r   r   
conditionsr   r   r   register_event   s    r:   r   c                 C   s
   t | S )z*Get applicable events from global registry)r8   r+   )r   r   r   r   r+      s    r+   r,   c                   C   s   t  S )z Get total registered event count)r8   r-   r   r   r   r   event_count   s    r;   )r4   typingr   r   r   r   r   r   logging	getLoggerr1   r   r   r8   r5   r:   r7   r+   r6   r;   r   r   r   r   <module>   s    
{	