
    h(                         d dl mZmZmZmZ d dlmZmZ d dlZd dl	Z	d dl
Z
d dlmZ d dlmZmZmZmZ  G d d          ZdS )    )capture_exceptioncapture_messageset_tagset_context)monitor_azure_apimonitor_critical_systemN)BeautifulSoup)AZURE_DEVOPS_URLAZURE_DEVOPS_ORGAZURE_DEVOPS_PROJECTAZURE_DEVOPS_PATc                   L    e Zd ZddZed	d            ZdefdZd
dedefdZ	dS )AzureClientNc                 &   t          d|            |r|                    dt                    | _        |                    dt                    | _        |                    dt                    | _        |                    dt                    | _	        t          d| j         d| j         d| j         d	| j	        rd
t          | j	                  z  nd            ny|pt          | _        |pt          | _        d | _        |pt          | _	        t          d| j         d| j         d| j         d	| j	        rd
t          | j	                  z  nd            d | _        | j        rdt          | j        t                    rJ| j                            d          sd| j        z   | _        | j                            d          | _        d S t          | j        t                    s.t          dt!          | j                   d           d | _        d S d S )Nu7   🔧 AzureClient constructor called with: azure_config=urlorgprojectpatu    🔧 Using azure_config - URL: '	', Org: '', Project: '', PAT: *Noneu!   🔧 Using direct params - URL: ')zhttp://https://r   /u   ❌ Invalid azure_url type: z, expected string)printgetr
   	azure_urlr   	azure_orgr   azure_projectr   	azure_patlen
last_error
isinstancestr
startswithrstriptype)selfr   r   r!   azure_configs        K/var/www/html/testcasegenerator.evdpl.com/azure_integration/azure_client.py__init__zAzureClient.__init__   s   VVVWWW 	C)--e5EFFDN)--e5EFFDN!-!1!1)=Q!R!RD)--e5EFFDN  AT^  A  Adn  A  Akok}  A  A  ei  es  H  HK  NQ  RV  R`  Na  Na  Ha  Ha  y  A  A  B  B  B  B ':*:DN&:*:DN!%D&:*:DN  Bdn  B  Bt~  B  Blpl~  B  B  fj  ft  I@  IL  OR  SW  Sa  Ob  Ob  Ib  Ib  z@  B  B  C  C  C > 		"j== 		">,,-DEE =!+dn!< "^22377DNNNDNC00 	"Xdn1E1EXXXYYY!DNNN	" 	"    c                    |s4t          j        dd                              d          }d |D             }|st          d           d S t          d| j         d| j         d| j         d	| j        rd
t          | j                  z  nd            | j        sd| _	        t          d           d S | j        sd| _	        t          d           d S | j        sd| _	        t          d           d S | j        sd| _	        t          d           d S g }d}ddt          j        d| j                                                                                    dd }t          dt          |          |          D ]}||||z            }d                    d |D                       }| j         d| j         d| j         d| d	 t!          d           fd!            } |            }	|	j        dk    r|	                                pi }
|
                    d"g           }|D ]}t)          |                    d#                    }|                    d$i           }|                    d%d&          }|                    d'd(          }|                    || ||          d)           t          d*t          |           d+           n&d,|	j         }|| _	        t          d-| d.|            ~# t,          $ rZ}d/t)          |           }|| _	        t          d-|            t/          ||| j        | j        | j        d0           Y d }~d }~ww xY w|S )1NAZURE_DEVOPS_WORKITEM_IDS ,c                 ^    g | ]*}|                                 |                                 +S  )strip).0ids     r+   
<listcomp>z6AzureClient.fetch_azure_work_items.<locals>.<listcomp>0   s-    NNNB288::NRXXZZNNNr-   uW   ⚠️ Work item IDs not found. Please set AZURE_DEVOPS_WORKITEM_IDS in your .env file.u%   🔍 Validating Azure fields - URL: 'r   r   r   r   r   z Azure DevOps URL cannot be emptyu$   ❌ Azure DevOps URL cannot be emptyz)Azure DevOps organization cannot be emptyu-   ❌ Azure DevOps organization cannot be emptyz$Azure DevOps project cannot be emptyu(   ❌ Azure DevOps project cannot be emptyz2Azure DevOps Personal Access Token cannot be emptyu6   ❌ Azure DevOps Personal Access Token cannot be empty   application/jsonBasic :AcceptAuthorizationc                 N    t          | pdd          }|                                S )Nr0   zhtml.parser)r	   get_text)textsoups     r+   
clean_htmlz6AzureClient.fetch_azure_work_items.<locals>.clean_htmlU   s#     ];;D==??"r-   r   c                 ,    g | ]}t          |          S r3   )r%   )r5   xs     r+   r7   z6AzureClient.fetch_azure_work_items.<locals>.<listcomp>[   s    !<!<!<Q#a&&!<!<!<r-   r   z/_apis/wit/workitems?ids=z&api-version=6.0T)criticalc                  2    t          j         d          S )N   headerstimeout)requestsr   )rJ   r   s   r+   make_azure_requestz>AzureClient.fetch_azure_work_items.<locals>.make_azure_requestb   s    #<WbIIIIr-   valuer6   fieldszSystem.TitlezNo Title FoundzSystem.DescriptionzNo Description Found)r6   titledescriptionu   ✅ Successfully fetched z work items in batchz"Failed to fetch work items batch: u   ❌ z - ids: z#Error processing work items batch: )work_item_idsr   r   r    )osgetenvsplitr   r   r   r    r!   r"   r#   base64	b64encodeencodedecoderangejoinr   status_codejsonr   r%   append	Exceptionr   )r)   rR   results
CHUNK_SIZErC   i	chunk_ids	ids_paramrM   responsebodyitemswiwidrO   rP   rQ   	error_msgerJ   r   s                      @@r+   fetch_azure_work_itemsz"AzureClient.fetch_azure_work_items,   s    	OI&A2FFLLSQQMNN-NNNM 	klll4 	  Bdn  B  Bt~  B  Blpl~  B  B  fj  ft  I@  IL  OR  SW  Sa  Ob  Ob  Ib  Ib  z@  B  B  	C  	C  	C~ 	@DO89994~ 	IDOABBB4! 	DDO<===4~ 	RDOJKKK4
(`f&67K4>7K7K7R7R7T7T&U&U&\&\&^&^``
 

	# 	# 	# q#m,,j99 )	 )	A%aJ&67I!<!<)!<!<!<==I> 4 4DN 4 4T5G 4 4!4 4 4 
!"D111J J J J J 21J .-//'3..#==??0bD HHWb11E# 	 	!"&&,,//!#"!5!5 &

>;K L L&,jj1EG]&^&^"%%*+5:k+B+B( (    
 Vc%jjVVVWWWW [XEY [ [I&/DO???I??@@@ 	 	 	J#a&&JJ	"+(Y(()))!!%.!%!%%)%7	& &        		 s   D/K99
MAMMproject_namec                    	 | j          d| j         d| d}ddt          j        d| j                                                                                    d}t          j        ||d	          }|	                                 |
                                S # t          $ r }t          d
| d|            Y d}~dS d}~ww xY w)zGet project informationr   z/_apis/projects/?api-version=6.0r9   r:   r;   r<   rH   rI   u   ❌ Failed to get project : N)r   r   rV   rW   r!   rX   rY   rL   r   raise_for_statusr]   r_   r   )r)   rm   r   rJ   re   rk   s         r+   get_projectzAzureClient.get_project   s    	^dddnddldddC,!d&*:;Ot~;O;O;V;V;X;X*Y*Y*`*`*b*b!d!d G
  |C"EEEH%%'''==??" 	 	 	B|BBqBBCCC44444	s   BB 
C&CClimitc           	      `   	 t          d|            | j         d| j         d| d}dddt          j        d| j                                                                                    d}d| d	g}|rgt          |t          t          f          rKt          |          d
k    r8d                    d |D                       }|                    d| d           d                    |          }d| d}	d|	i}
t          d|            t          j        |||
d          }t          d|j                    |j        dk    r!t          d|j         d|j                    g S |                                 |                                }|                    dg           }t          dt          |           d           g }||n	|d|         }|D ]}|d         }| j         d| j         d| d| d }t          j        ||d!          }|j        dk    r(|                    |                                           lt          d"| d#|j                    t          d$t          |           d%           |S # t*          $ r}t          d&|            g cY d}~S d}~ww xY w)'a4  Get recent work items for suggestions
        :param project_name: Azure DevOps project name
        :param limit: Max number of items to return (None for all, details fetch still respects this cap)
        :param states: Optional list of state names to filter by (e.g., ['Ready for QA', 'Re-open'])
        u&   🔍 Fetching work items for project: r   z/_apis/wit/wiql?api-version=6.0r9   r:   r;   )r=   zContent-Typer>   z[System.TeamProject] = ''r   z, c                     g | ]}d | d 	S )ru   r3   )r5   ss     r+   r7   z5AzureClient.get_recent_work_items.<locals>.<listcomp>   s     *D*D*D8q888*D*D*Dr-   z[System.State] IN ()z AND z_SELECT [System.Id], [System.Title], [System.WorkItemType], [System.State] FROM WorkItems WHERE z# ORDER BY [System.ChangedDate] DESCqueryu   🔍 Making WIQL request to: rH   )rJ   r]   rK   u   🔍 WIQL response status: r8   u   ❌ WIQL request failed: z - 	workItemsu   🔍 Found z work items in WIQL responseNr6   z/_apis/wit/workitems/ro   rI   u(   ❌ Failed to get details for work item rp   u&   🔍 Successfully fetched details for z work itemsu%   ❌ Failed to get recent work items: )r   r   r   rV   rW   r!   rX   rY   r$   listtupler"   r[   r^   rL   postr\   rA   rq   r]   r   r_   )r)   rm   rs   statesr   rJ   where_clausesquoted_states	where_sql
wiql_querypayloadre   result
work_itemsdetailed_itemsitems_to_processitemitem_iditem_urlitem_responserk   s                        r+   get_recent_work_itemsz!AzureClient.get_recent_work_items   sZ   :	I<IIJJJ^dddndd|dddC, 2!d&*:;Ot~;O;O;V;V;X;X*Y*Y*`*`*b*b!d!d G HGGGHM M*VdE];; MFa !%		*D*DV*D*D*D E E$$%K=%K%K%KLLL]33I5"5 5 5  
+G7#77888}S'QSTTTHF0DFFGGG#s**Z(2FZZ8=ZZ[[[	%%''']]__FK44JMJMMMNNN  N-2]zz
6E6@R( m mt*"n||t~||||cj||| (XwPR S S S ,33"))-*<*<*>*>????kWkkP]Pikkllll[3~;N;N[[[\\\!! 	 	 	=!==>>>IIIIII	s%   E)J ,DJ 
J-J("J-(J-)NNNN)N)NN)
__name__
__module____qualname__r,   r   rl   r%   rr   intr   r3   r-   r+   r   r      s        " " " "@ W W W Wr     @ @# @c @ @ @ @ @ @r-   r   )utils.error_loggerr   r   r   r   utils.error_monitorr   r   rS   rL   rV   bs4r	   config.settingsr
   r   r   r   r   r3   r-   r+   <module>r      s    W W W W W W W W W W W W J J J J J J J J 				         f f f f f f f f f f f fK K K K K K K K K Kr-   