
    koi                        d Z ddlZddlZddlZddlmZ ddlmZ  ej                  e	      Z
 ej                  dd      	 	 	 	 	 	 	 	 ddee   d	ee   d
edededee   dedefd       Z ej                  dd      ddee   fd       Zy)z
Hold Task Poller
================

Celery task that polls for HOLD tasks and starts them when dependencies are met.
Uses non-blocking self-rescheduling to avoid blocking the worker.
    N)Optional)
celery_appT:src.smart_inventory.tasks.hold_task_poller.poll_hold_tasks)bindname
company_idbatch_idmax_duration_secondspoll_interval_secondsmain_poll_interval_seconds_start_time_total_started_iterationsc	                    	 ddl m}	 ddlm}
m} ddlm}m} |t        j                         }t        j                         |z
  }||k\  r!t        j                  d	| d
       d|||ddS  |	       }	  |||      } |||      }|s/|s-t        j                  d       d|||dd|j                          S d}|r| |
|||      z  }|r| |||      z  }||z  }|dz  }|dkD  rt        j                  d| d       |dz  dk(  rt        j                  d|dd| d       |j                          |||||||d}t"        j$                  dk(  rt&        j)                  ||       nt+        j,                  d||       d|||ddS # t        $ r0}t        j                  d|        dt        |      dcY d}~S d}~ww xY w# t         $ r"}t        j                  d|        Y d}~d}~ww xY w# |j                          w xY w)a  
    Poll for HOLD tasks and start them when dependencies are met.
    
    This task handles BOTH:
    - Snapshot tasks (daily_sales, inventory_snapshot, etc.)
    - CSV processing tasks (product, purchase_order, sales_order, etc.)
    
    This task uses non-blocking self-rescheduling:
    - Checks if HOLD tasks can be started
    - Reschedules itself with countdown to avoid blocking the worker
    - Stops when no HOLD tasks remain or max duration is reached
    
    Args:
        company_id: Optional filter by company
        batch_id: Optional filter by batch
        max_duration_seconds: Maximum time to poll (default 5 minutes)
        poll_interval_seconds: How often to check for HOLD tasks (default 2 seconds)
    r   get_db_sessionprocess_hold_taskshas_hold_tasksprocess_hold_csv_taskshas_hold_csv_tasks#Failed to import required modules: FsuccesserrorNzHold poller timeout (zs)Ttimeout)r   total_startedduration_seconds
iterationsreasonz)No HOLD tasks remaining (snapshot or CSV)no_hold_tasks   zStarted z HOLD tasks (snapshot + CSV)
   zHold poller: z.0fzs, z startedzError in hold task poller: )r   r	   r
   r   r   r   r   win32)kwargs	countdownr   rescheduled)src.utils.dbr   +src.smart_inventory.utils.task_orchestratorr   r   /src.smart_inventory.utils.csv_task_orchestratorr   r   ImportErrorloggerr   strtimedebugcloseinfo	Exceptionsysplatformpoll_hold_tasksapply_asyncr   	send_task)selfr   r	   r
   r   r   r   r   r   r   r   r   r   r   eelapseddbhas_snapshot_holdhas_csv_holdstartedtask_kwargss                        I/var/www/html/hubwallet-dev/src/smart_inventory/tasks/hold_task_poller.pyr6   r6      sE   <3/bn iikiikK'G &&,-A,B"EF+ '%
 	
 
	B&*2z:)"j9 LLDE!/$+))> 	
- )"j(CCG -b*==G'!qQ;KK(7)+GHI q LL=S8HQR 	

 ! 4!6"("K ||w##;BW#X 	H+	
 '#! m  3:1#>? 3q6223t  821#6778 	
sN   F 32G 6A,G 	G %F;5G ;G 	G.G)$G1 )G..G1 1HzGsrc.smart_inventory.tasks.hold_task_poller.check_and_process_hold_tasksc                 @   	 ddl m} ddlm}m} ddlm}m}  |       }	  |||      }	 |||      }
|	s|
sd	d
dd|j                          S d}|	r| |||      z  }|
r| |||      z  }d	|d| d|j                          S # t        $ r0}t        j                  d|        dt        |      dcY d}~S d}~ww xY w# t        $ r@}t        j                  d|        dt        |      dcY d}~|j                          S d}~ww xY w# |j                          w xY w)z
    One-time check to process any HOLD tasks (both snapshot and CSV).
    Use this for manual triggering or scheduled checks.
    
    Args:
        company_id: Optional filter by company
    r   r   r   r   r   Fr   NTzNo HOLD tasks to process)r   messager?   z/Processed HOLD tasks (snapshot + CSV), started )r   r?   rC   zError checking HOLD tasks: )r)   r   r*   r   r   r+   r   r   r,   r-   r   r.   r1   r3   )r9   r   r   r   r   r   r   r:   r<   r=   r>   r?   s               rA   check_and_process_hold_tasksrD      s,   3/bn
 
	B*2z:)"j9 #0JWXY. 	
+  )"j99G -b*==G H	R
 	
E  3:1#>? 3q6223:  321#67 3q622 	
3
 	
sR   B B? &B? 	B<%B71B<7B<?	D%D-D.D DD D)NNi,        Nr   r   )N)__doc__loggingr4   r/   typingr   src.utils.celery_workerr   	getLogger__name__r-   taskintr.   floatr6   rD        rA   <module>rR      s     
   .			8	$ d!]^ !%" #!"&(#'}} sm} 	}
 } !$} %} } } _}@ d!jk.8C= . l.rQ   