o
    :|h2                     @   s>   d dl Z d dlmZmZ d dlmZmZmZ G dd dZdS )    N)
TaskOutputTask)OptionalTupleUnionc                   @   sj   e Zd Zdd Zdd Zdededeeef fdd	Z	defd
dZ
dedeeef fddZdd ZdS )GuardRailFnc                 C   sp   d}d}t d| }|D ]'}t d|}|r3t|d}|d}d|v r+||7 }qd|v r3||7 }q||fS )N        z####\s*\*{0,2}Duration\*{0,2}\s*(.*)-(\d+(?:\.\d+)?)\s*(hours|hour|minutes|minute)      minutehour)refindallsearchfloatgroup)texttotal_minutestotal_hoursduration_lineslinematchvalueunit r   /home/azureuser/microlearn/backend/user_journey_with_openai/agentic_workflow/src/user_journey_service/processors/guardrail_fn.pyextract_and_sum_durations   s   

z%GuardRailFn.extract_and_sum_durationsc                 C   sp   d}d}t d| }|D ]'\}}t|}d|v r$td|  ||7 }qd|v r3td|  ||7 }q||fS )Nr   r	   r   zHour unit detected : r   zMinute unit detected : )r   r   r   print)time_strhoursminutesmatchesr   r   r   r   r   parse_available_time   s   
z GuardRailFn.parse_available_timeresultavailable_timereturnc              
   C   s   z]t dt|   t| j\}}t d| d|  t|\}}t d| d|  ||d  }||d  }|| }|dkrJdd	| d
fW S |dk rYddt| d
fW S d| fW S  ty{ }	 ztd|	 d}
d|
fW  Y d}	~	S d}	~	ww )z$Validate content meets requirements.zThe task outputs type is : zThe total minutes is : z and total hours is : z The available time minutes is : z and available time hours is : <   r   Fz=The user journey duration is less than the available time by z	 minutes.z8The user journey duration exceeds the available time by Tz$Unexpected error during validation: )outputN)	r   typer   r   rawr#   abs	Exceptionr   )r$   r%   r   r   input_minutesinput_hourstask_total_minutesavailable_total_minutestime_difference_minuteseerror_resultr   r   r   validate_content-   s&   
zGuardRailFn.validate_contentc                    s*   dt dttttt f f f fdd}|S )Nr$   r&   c                    s   t |  S N)r   r4   r$   r%   r   r   validateF   s   z<GuardRailFn.get_validate_content_guardrail.<locals>.validater   r   boolr   str)r%   r8   r   r7   r   get_validate_content_guardrailE   s   &z*GuardRailFn.get_validate_content_guardrailc              
   C   sf   zt d td| j}t d dd |D }d| fW S  ty2 } zt | W Y d }~dS d }~ww )NzInside guardrail functionz##\s*([\w\s]+?)\s*-\s*(\d+)%zmatch foundc                 S   s   i | ]\}}|  t|qS r   )stripint).0skillpercentr   r   r   
<dictcomp>Q   s    z4GuardRailFn.validate_op_defaults.<locals>.<dictcomp>T)FzThe format of the output is not correct. Follow this format -  
            ## SQL - ....% 
            ## Viz - ....% 
            ## Stats - ....%
            ## Comm - ....%
            ## Story - ....%)r   r   r   r*   r,   )r$   r"   skills_dictr2   r   r   r   validate_op_defaultsJ   s   
z GuardRailFn.validate_op_defaultsc                  C   s&   dt dttttt f f fdd} | S )Nr$   r&   c                 S   s
   t | S r5   )r   rD   r6   r   r   r   r8   ^   s   
z2GuardRailFn.validate_defaults_op.<locals>.validater9   )r8   r   r   r   validate_defaults_op]   s   "z GuardRailFn.validate_defaults_opN)__name__
__module____qualname__r   r#   r   r;   r   r:   r4   r<   rD   rE   r   r   r   r   r      s    r   )	r   crewair   r   typingr   r   r   r   r   r   r   r   <module>   s    