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š|sšqt|d r¨|s¨qt|d r¾|d |kr¾qt| 	|¡ 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    
{ü	