o
    /i                     @   sz   d dl mZ d dlmZ d dlmZmZ d dlmZmZm	Z	 er2d dl
mZ ddlmZ ddlmZ eG d	d
 d
ZdS )    )Iterable)	dataclass)datetime	timedelta)TYPE_CHECKINGOptionalUnion)Pipeline   )Job)Queuec                	   @   s   e Zd ZU dZeed< ee ed< ddedeeee	e f  fddZ
ededee d	efd
dZedddddded fddZdS )Repeata  Defines repeat behavior for scheduled jobs.

    Attributes:
        times (int): The number of times to repeat the job. Must be greater than 0.
        intervals (Union[int, List[int]]): The intervals between job executions in seconds.
            Can be a single integer value or a list of intervals. If a list is provided and it's
            shorter than (times-1), the last interval will be reused for remaining repeats.
    times	intervalsr   intervalc                 C   sz   |dk rt dt|tr|dk rt d|g| _nt|tr4t|}|D ]
}|dk r/t dq%|| _ntd|| _dS )a  Initialize a Repeat instance.

        Args:
            times (int): The number of times to repeat the job. Must be greater than 0.
            interval (Optional[Union[int, Iterable[int]]], optional): The intervals between job executions in seconds.
                Can be a single integer value or a list of intervals. Defaults to 0 (immediately repeated).

        Raises:
            ValueError: If times is less than 1 or if intervals contains negative values.
        r
   z*times: please enter a value greater than 0r   z+intervals: negative numbers are not allowedz,intervals must be an int or iterable of intsN)
ValueError
isinstanceintr   r   list	TypeErrorr   )selfr   r   interval_listi r   I/var/www/html/flask_server/venv/lib/python3.10/site-packages/rq/repeat.py__init__   s   



zRepeat.__init__countreturnc                 C   s   |t |kr
|d S || S )zReturns the appropriate interval based on the repeat count.

        Args:
            count (int): Current repeat count (0-based)
            intervals (List[int]): List of intervals

        Returns:
            int: The interval to use
        )len)clsr   r   r   r   r   get_interval8   s   zRepeat.get_intervalNjobr   queuer   pipeliner	   c                 C   s   |j du s
|j dkrtd|j d|dur|n|j }|j d }d}|jr/| ||j}|j d |_ |j|d |dkrG|j||d nt	
 t|d }|j|||d |du rb|  dS dS )aQ  Schedules a job to repeat based on its repeat configuration.

        This decrements the job's repeats_left counter and either enqueues
        it immediately (if interval is 0) or schedules it to run after the
        specified interval.

        Args:
            job (Job): The job to repeat
            queue (Queue): The queue to enqueue/schedule the job on
            pipeline (Optional[Pipeline], optional): Redis pipeline to use. Defaults to None.

        Returns:
            scheduled_time (Optional[datetime]): When the job was scheduled to run, or None if not scheduled
        Nr   zCannot schedule job z: no repeats leftr
   )r$   )seconds)repeats_leftr   id
connectionr$   repeat_intervalsr!   save_enqueue_jobr   nowr   schedule_jobexecute)r    r"   r#   r$   piperepeat_countr   scheduled_timer   r   r   scheduleI   s    
zRepeat.schedule)r   )N)__name__
__module____qualname____doc__r   __annotations__r   r   r   r   r   classmethodr!   r2   r   r   r   r   r      s   
 	$"r   N)collections.abcr   dataclassesr   r   r   typingr   r   r   redis.clientr	   r"   r   r#   r   r   r   r   r   r   <module>   s    