U
    h                 	   @   sT  d dl mZmZmZmZmZ ed d dlmZmZm	Z	m
Z
mZmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZmZ d d
lmZ d dlZd dlZd dl m Z m!Z! d dl"Z"d dl#Z#d dl$Z$d dl%Z%d dl&m'Z' d dl(m)Z) d dl*m+Z+ ee,Z-ee- ej./dde-j0d< e!dde-j0d< e$j1e$j2dd e$3e,Z4e-5ddd Z6e-5ddd Z7e-5ddd Z8e-5d d!d" Z9e-5d#d$d% Z:e-5d&d'd( Z;e-5d)d*d+ Z<e-5d,d-d. Z=e-5d/d0d1 Z>e-5d2d3d4 Z?e-5d5d6d7 Z@e-5d8d9d: ZAe-5d;d<d= ZBe-5d>d?d@ ZCe-5dAdBdC ZDd dl(m)Z) dDeE eE dEdEg d e) dFZFe-j5dGdHgdIdJdK ZGe-5dLdMdN ZHe-5dOdPdQ ZIe-5dRdSdT ZJe-5dUdVdW ZKe-5dXdYdZ ZLe-5d[d\d] ZMe-j5d^dHgdId_d` ZNe ZOe-j5dadHgdIdbdc ZPe-5dddedf ZQe-5dgdhdi ZRe-5djdkdl ZSe-j5dmdngdIdodp ZTe-j5dqdHgdIdrds ZUe-j5dtdHgdIdudv ZVe-j5dwdngdIdxdy ZWe-j5dzdngdId{d| ZXe-j5d}dngdId~d ZYe-j5ddngdIdd ZZe-j5ddngdIdd Z[e-j5ddngdIdd Z\e-j5ddngdIdd Z]e-5ddd Z^e-5ddd Z_e-5ddd Z`e-j5ddHgdIdd Zae-j5ddHgdIdd Zbe-j5ddHgdIdd Zce-j5ddHgdIdd Zde-j5ddHgdIdd Zee-j5ddHgdIdd Zfe-j5ddHgdIdd Zge-j5ddHgdIdd Zhe-j5ddHgdIdd Zie-j5ddngdIdd Zje-j5ddHgdIdd Zke-j5ddHgdIdd Zle-j5ddngdIdd Zme-j5ddngdIdd Zne-j5ddngdIdd Zoe-j5ddngdIddĄ Zpe-j5ddngdIddǄ Zqe-j5ddHgdIddʄ Zre-j5ddngdIdd̈́ Zse-j5ddngdIddЄ Zte-j5ddHgdIddӄ Zue-j5ddHgdIddք Zve-j5ddngdIddل Zwe-j5ddgdIdd݄ Zxe-ydޡdd Zze-yddd Z{e-yddd Z|e-yddd Z}e-j~dd Ze,dkrPe-jddd dS )    )init_error_loggercapture_exceptioncapture_messageset_tagset_contextzai-test-case-generator-main)Flaskrequestjsonify	send_filerender_templateafter_this_request)CORS)fetch_issueAzureClient)generate_test_casegenerate_test_case_from_image)save_test_scriptsave_excel_reportextract_test_type_sectionsparse_traditional_format)MongoHandlerN)datetime	timedelta)urlparse)Lock)wrapsZJWT_SECRET_KEYz$your-secret-key-change-in-production   daysZJWT_ACCESS_TOKEN_EXPIRESz4%(asctime)s - %(name)s - %(levelname)s - %(message)s)levelformat/c                  C   s   t  d} td| dS )N%Y%m%d%H%M%Sz
index.html	timestamp)r   nowstrftimer   r%    r)   0/var/www/html/testcasegenerator.evdpl.com/app.pyindex%   s    r+   z
/analyticsc                   C   s   t dS )zAnalytics dashboard pagezanalytics.htmlr   r)   r)   r)   r*   analytics_dashboard+   s    r-   z/documentationc                   C   s   t dS )zDocumentation pagezdocumentation.htmlr,   r)   r)   r)   r*   documentation0   s    r.   z/comparisonc                   C   s   t dS )z$Competitive analysis comparison pagezcomparison.htmlr,   r)   r)   r)   r*   
comparison5   s    r/   z/signinc                   C   s   t dS )zSign in pagezsignin.htmlr,   r)   r)   r)   r*   signin:   s    r0   z/signupc                   C   s   t dS )zSign up pagezsignup.htmlr,   r)   r)   r)   r*   signup?   s    r1   z
/dashboardc                   C   s   t dS )zUser dashboard pagezdashboard.htmlr,   r)   r)   r)   r*   	dashboardD   s    r2   z/reset-passwordc                   C   s   t dS )zReset password pagereset-password.htmlr,   r)   r)   r)   r*   reset_passwordI   s    r4   z/reset-password-confirmc                  C   sR   t jd} | stdddS t }|| }|d s@tdddS td| |d d	S )
z Password reset confirmation pagetokenr3   zInvalid or missing reset tokenerrorsuccesszInvalid or expired reset tokenzreset-password-confirm.htmlemail)r5   r9   )r   argsgetr   r   Zverify_password_reset_token)r5   mongo_handlertoken_resultr)   r)   r*   reset_password_confirmN   s    
r>   z/admin-dashboardc                   C   s   t dS )zAdmin dashboard pagezadmin-dashboard.htmlr,   r)   r)   r)   r*   admin_dashboard^   s    r?   z/testc                   C   s"   t d tdt ddS )Nz=== TEST ENDPOINT CALLED ===zServer is working!r$   )messager&   )loggerinfor	   r   r'   r(   r)   r)   r)   r*   testc   s    
rC   z/selenium-statusc               
   C   s|   z*ddl m}  |  }|t|d}t|W S  tk
rv } z.td|  tdt|ddf W Y S d}~X Y nX dS )	z8Check if Selenium WebDriver can initialize on this host.r   )check_selenium_availability)selenium_availableZwill_be_used_in_url_flowzSelenium status check failed: F)rE   r7      N)ai.url_generatorrD   boolr	   	ExceptionrA   r7   str)rD   Z	availablestatuser)   r)   r*   selenium_statush   s    
rM   z/test-emailc               
   C   s   zVddl m}  |  }|r4tddt ddW S tddt ddd	fW S W nb tk
r } zDtd
t	|  tddt	| t ddd	f W Y S d}~X Y nX dS )zTest email notification systemr   )test_email_configurationr8   zTest email sent successfully!r$   rK   r@   r&   r7   z5Failed to send test email. Check email configuration.  z#Error testing email configuration: zError testing email: N)
utils.email_notifierrN   r	   r   r'   r(   rI   rA   r7   rJ   )rN   r8   rL   r)   r)   r*   
test_emailw   s2    

rR   /test-error-notificationc               
   C   s   zxddl m}  td}| ddddt  d|d	}|rVtd
dt ddW S tddt dddfW S W nb tk
r } zDt	dt
|  tddt
| t dddf W Y S d}~X Y nX dS )z'Test critical error notification systemr   ) send_critical_error_notificationz;This is a test critical error for email notification systemZ
TEST_ERRORz Test critical error notificationTrS   )rC   endpointr&   )Z
error_typeerror_messagecontext	exceptionr8   z*Test error notification sent successfully!r$   rO   r7   zBFailed to send test error notification. Check email configuration.rP   z"Error testing error notification: zError testing notification: N)rQ   rT   rI   r   r'   	isoformatr	   r(   rA   r7   rJ   )rT   Z
test_errorr8   rL   r)   r)   r*   test_error_notification   sD    


rZ   z/resultsc                  C   s   t jdpt jd} td|   | rt }|| }td|  |r|jd| i}|rp|di ni }t	d||dS t
d	|   t	d
dddfS t	d
dddfS )Nkeyr5   z!Received request with key/token: z#Retrieved URL params from MongoDB: _idstatus_timestampszresults.html)
url_paramsr]   zNo data found for key/token: 
error.htmlz[The requested test case data could not be found. The link may have expired or been invalid.rV     z/Invalid URL. Please use a valid test case link.  )r   r:   r;   rA   rB   r   Zget_url_data
collectionfind_oner   warning)	short_keyr<   r^   documentr]   r)   r)   r*   results   s    
rh   F )is_generatingcompleted_typestotal_typesphasecurrent_test_typelogprogress_percentagelockz/api/generatePOST)methodsc            F         s&  zt d d } tjrxztj} t d W q tk
rt } z*t d|  tddidf W Y W S d }~X Y qX ntj} t d t dt	|   t d	| rt
|  nd
  tjr2t dt
tj   tj D ]H\}}t d| d|j dt|drt| nd  |d qg tjrT| d| dg n6t| drl| dn| dg ttrgttrgstddidfW S d }tjd}|rL|drLz<|dd }t }||}|r|dr|d }W n8 tk
rJ } zt dt|  W 5 d }~X Y nX | sdtddidfW S | d}	|	stddidfW S t }
d }zt }d |	| r| d!rt| d!g nd|
 d"| d#tjd$tj |	| r
| d!r
t| d!g ndd%}|r4|d&|d'< |d(|d)< |!| W n8 tk
rx } zt d*t|  W 5 d }~X Y nX t"d+  d,t"d-< t# t"d.< d/t"d0< d1t"d2< g t"d3< dt"d4< d1t"d5< |	d6krt#d7d8 D t"d9< nZ|	d:krt#d;d8 D t"d9< n8| d!g }t|tr |g}t#fd<d8|D t"d9< W 5 Q R X |	d:kr$t d= t d>|   t$d?|   g }| d@i }|d:d1% }t dA|  t$dB|  |st$dC tddDidfW S ztt$dE|  t&|}t'|j(|j)gst$dF tddGidfW W S t$dH|  zdt*j|dId$dJidK}t$dL|j+  |j+dMk sh|j+dNkrt$dO|j+  t dP|j+ dQ W nD tk
r } z$t$dR|  t dS| dQ W 5 d }~X Y nX t$dT z"ddUl,m-} t dV t$dW W n` tk
r^ } z@t dX|  t$dY|  tddX| idZf W Y W W S d }~X Y nX rjnd[g}t d\  t d]|  t$d^|  dd l.}t|/ }t$d_|  dd l0}t$d` ddadb}t"d+ ( dct"d0< t"d3 1dd| de|  W 5 Q R X |j2|||||r,|d&nd fd,df3  tdg|iW W S  t*j4k
r } z@t"d+  dht"d-< W 5 Q R X tddit| idf W Y W S d }~X Y nt tk
r } zTt djt|  t"d+  dht"d-< W 5 Q R X tddjt| idZf W Y W S d }~X Y nX nh|	d6krt dk t dt
tj   t dlt
tj   g }dmtjkrt dn tddoidfW S tjdm }t dp|j dt|drt| nd  |d |jd1k	rt dq tddridfW S dd l.}t5 6ds dtt|/ d du  }t7j89t7j8:t;dvdw}t7j<|d,dx t7j8=|jd }dy| | }t7j89||}|>| zddzl?m@} 	st7A| t"d+  dht"d-< W 5 Q R X tddidfW W S d } d,}!g }"D ]}#zt d{|# d| |||#gd}}$|$
rj| 
r4| d~|$ 7 } n|$} t"d+ " | dt|# }%t"d. B|% W 5 Q R X n(|"1d|# d| t d|# d| dh}!W 	q tCk
rZ } zt|}&|"1|& t jd|# d|& d,d dh}!d|&D k
sd|&D krJt7j8E|rt7A| t"d+  dht"d-< W 5 Q R X tFd|&ddf W Y   W W S W 5 d }~X Y n` tk
r } z@|"1d|# dt|  t jd|# dt| d,d dh}!W 5 d }~X Y nX 	q| szt7A| t"d+  dht"d-< W 5 Q R X d}&|"rf|&d|"d  7 }&|"D ]Z}'d|'ks"d|'kr.d}& qfn4d|'D ksJd|'D kr
tFddddf  W W S q
td|&idfW W S d| }(tG| |(})tH| |(}*|)rt|*rt|)|*d}+g },tI| d~D ]4\}-}.|.% rd|-d  }/|,1|/|.d1d qtJ| }0g }1|0r4|0 D ] \}2}3tK|3|2d}4|1L|4 qntK| }1t }|M|,d6||1d|d6|rd|d& nd }t }5|5|
 N }6z||rd|d6dt|+|6|
 |5 |6d	| d#tjd$tj d6dd%}|r|d&|d'< |d(|d)< |!| W n8 tk
r2 } zt dt|  W 5 d }~X Y nX t"d+  t"d9 O t"d.< dht"d-< W 5 Q R X td,||+dW W S t7A| t"d+  dht"d-< W 5 Q R X tddidfW W S W q tk
r } zt7j8E|rt7A| t"d+  dht"d-< W 5 Q R X t jdt| d,d dt| d}&dt|D ksFdt|D krLd}&nRdt|D kspdt|D krvd}&n(dt|D ksdt|D krd}&td|&idZf W Y W S d }~X Y nX 	ntj} | dd}	| d!g }t d|	  t d|  | d| dg ttr.gsFtddidfW S t|trX|g}t d| dt| d t d  t|dIkrt dt| d n<t|dkrt dt| d nt dt| d i }+i }7d,}!|D ] t d   d } |	dkrt| d}8t d   z2tP |8}9|9sdt d   d|7 < W qW nZ tk
r } z:t d  dt|  dt| |7 < W Y qW 5 d }~X Y nX t d  d|9dd  |9di }:|:d};|:dd  }< fdd}=|=|;}>D ]L}#zt d{|# d   tQ|>pH|<|<|#gd}$|$r| rn| d~|$ 7 } n|$} t"d+ n   dt|# }%t"d. B|% tt"d. tt"d9  d }?t dtt"d.  dtt"d9  d|?ddÝ W 5 Q R X t d|# d   nt d|# dƈ   dh}!W nH tk
rj } z(t d|# d  dt|  dh}!W 5 d }~X Y nX q n|	dkrVt dȡ | dɡ}@t d|@  t dt	|@  |@rt dt|@tRrt
|@ nd͛  t dt|@tRrt
|@S nd͛  |@r<t'|@S r<t d|@  tT|@dЍ}An<t dѡ t dtU|@ d|@rht'|@S ndh  tT }AzV|AV g}B|Brt|Bdkrt|Adԃr|AjWr|AjW}C|C|7 < nd|7 < W qW nZ tk
r( } z:t dֈ  dt|  dt| |7 < W Y qW 5 d }~X Y nX |Bd }DD ]}#ztQ|Dd |Dd |#gd}$|$r| rp| d~|$ 7 } n|$} t"d+ n   dt|# }%t"d. B|% tt"d. tt"d9  d }?t dtt"d.  dtt"d9  d|?ddÝ W 5 Q R X t d|# d   ndh}!W nB tk
rP } z"t d|# dt|  dh}!W 5 d }~X Y nX q6| srt dو  dڝ qt dۈ  dܝ d19dd8  D }Ed|E }(tG| |(})tH| |(}*|)r|*r|)|*| dߜ|+ < t d  d|) d|*  nt d  d|) d|*  qt dt
|+  dt|+ d t"d+  dht"d-< W 5 Q R X |+st d |	dkr~td|7ddfW S |	dkrtd|7ddfW S |	d6krtddidfW S tddidfW S g },|D ]  |+krtI|+  dd1d~D ]:\}-}.|.% rd  dt|-d  }/|,1|/|.d1d qt }|M|+|,|	|d|r\|d nd |	|rn|d& nd }t"d+  |t"d5< W 5 Q R X t }5|5|
 N }6z|r8d||	t|t|+|6|
 |5 |r|6t| ndd	| d#tjd$tj |	t|d%}|r.|d&|d'< |d(|d)< |!| W n8 tk
rr } zt dt|  W 5 d }~X Y nX qtd,||+|7dW S W n tk
r  } zrt jdt| d,d tX||	|tjd$dtj d t"d+  dht"d-< W 5 Q R X tdt|idZf W Y S d }~X Y nX d S )Nz === GENERATE ENDPOINT CALLED ===zRequest processed as JSONzFailed to parse JSON request: r7   zInvalid JSON requestrb   zRequest processed as FormDatazRequest data type: zRequest data keys: NonezRequest files: zFile : z, size: readunknownr   ztestCaseTypes[]ZtestCaseTypesgetlistz)Please select at least one test case typeAuthorizationBearer     r8   userFailed to verify auth token: zNo request data receivedZ
sourceTypezSource type is requiredZgenerate_button_clickZitemId)source_typetest_case_types
item_countgeneration_start_time
session_id
User-Agent
event_type
event_datar   
user_agent
ip_addressr   r   r   iduser_idrole	user_rolez'Failed to track generate button click: rq   Trj   rk   Zstartingrm   ri   rn   ro   rp   final_url_keyimagec                 s   s   | ]}d | V  qdS )image_Nr)   .0	test_typer)   r)   r*   	<genexpr>S  s     zgenerate.<locals>.<genexpr>rl   urlc                 s   s   | ]}d | V  qdS )Zurl_Nr)   r   r)   r)   r*   r   V  s     c                 3   s&   | ]} D ]}| d | V  q
qdS )_Nr)   )r   item_idr   selected_typesr)   r*   r   \  s       z === URL SOURCE TYPE DETECTED ===zReceived data: z[DEBUG] URL request received: 
url_configzURL from config: z[DEBUG] URL extracted: z[DEBUG] No URL found in requestURL is requiredz%[DEBUG] Starting URL processing for: z[DEBUG] Invalid URL formatInvalid URL formatz#[DEBUG] Testing URL accessibility: 
   zsMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36)timeoutheadersz[DEBUG] URL response status: rF   i,  z$[DEBUG] URL not accessible, status: zURL returned status z, but continuing anywayz[DEBUG] URL access error: zCould not access URL: z"[DEBUG] Importing URL generator...generate_url_test_casesz#Successfully imported URL generatorz+[DEBUG] URL generator imported successfullyzError importing URL generator: z[DEBUG] Import error: rP   Zdashboard_functionalzSelected types from request: zTest case types to generate: z[DEBUG] Test case types: z[DEBUG] Generated URL key: z/[DEBUG] Starting async URL generation thread...c                 S   s  zt d|  d|  td t }td " dtd< td d|   W 5 Q R X t d	 d
dlm} t d|   td " dtd< td d|  W 5 Q R X || |}tdt	|  |st
dd| d}tjtjtd}tj|dd tj||}	t|	ddd,}
|
d|  d |
d |
| W 5 Q R X d| }t||}td|  |d| ||	dt d}zt }td t| d!|rt|nd
  td"|r|d d# nd$  t|}td%t| d!|r
t|nd
  |rt|D ]t\}}|d&g }td'|d(  d)|d*d+ d,t| d- |rtd.|d
   ntd/|d(   q"t|trtd0|d d1   d2d3d4d5d6gd7d8g}n$t|tstd9t|  g }| |d| ||d:|d|}td;|  W nh t!k
r } zHtd<|  td=t|  d
d l"}td>|#   |}W 5 d }~X Y nX zlt }|| $ }d?|d|d(d(||% |% |d@	d dAdBd|d(dC}|r||dD< |&| tdE W n4 t!k
r0 } ztdF|  W 5 d }~X Y nX td T t'tdG tdH< dItdJ< dKtdL< dtd< td dM |tdN< tdO|  W 5 Q R X W nl t!k
r } zLtdP|  td * dItdJ< dQtd< td dR|  W 5 Q R X W 5 d }~X Y nX d S )SNz [DEBUG ASYNC] Starting for URL: z	, types: z2[URL ASYNC] Starting direct URL content generationrq   Zfetching_contentrm   ro   zFetching content from z([DEBUG ASYNC] Importing URL generator...r   r   z%[DEBUG ASYNC] Fetching content from: Zai_generationz2Generating test cases from URL content for types: z9[URL ASYNC] Direct URL generation finished, has content: z.Failed to generate test cases from URL contentZurl_test_cases_.txtZuploadsTexist_okwutf-8encodingzURL: 
z9Generated Test Cases (via direct URL content analysis):

z"[URL ASYNC] Generated Excel file: r   Z	completed)url_keyr   r   r   Zcontent_filerK   
created_atz-[URL ASYNC] About to parse test cases. Type: z
, Length: z+[URL ASYNC] First 500 chars of test cases: rP   rt   z$[URL ASYNC] Parsed test data. Type: Stepsz[URL ASYNC] Test case r|   z 'TitleUnknownz' has z stepsz[URL ASYNC] First step: z)[URL ASYNC] No steps found for test case zJ[URL ASYNC] parse_traditional_format returned a string instead of a list: rF   ZGeneralzGenerated Test CasezTest scenario from URL contentzStep 1: Navigate to the URLzStep 2: Verify contentz+Content should be accessible and functional)ZSectionr   Scenarior   Expected Resultz?[URL ASYNC] parse_traditional_format returned unexpected type: )
test_casesr   r   r   	test_dataz*[URL ASYNC] Saved test case with URL key: z&[URL ASYNC] Failed to save test case: z[URL ASYNC] Exception type: z[URL ASYNC] Full traceback: test_case_generated	r   r   r   r   Zfiles_generatedZgeneration_duration_secondsr   generation_end_timeZaverage_time_per_itemzURL Generator	127.0.0.1r   r   z2[URL ASYNC] Tracked URL test case generation eventz6[URL ASYNC] Failed to track URL test case generation: rl   rk   Frj   d   rp   zGeneration completedr   z4[URL ASYNC] Set final_url_key in generation status: z[URL ASYNC] Error: r7   Error: )(printrA   rB   r   utcnowgeneration_statusappendrG   r   rH   RuntimeErrorospathjoindirname__file__makedirsopenwriter   r'   r   typelenr   	enumerater;   re   
isinstancerJ   r7   listsave_test_caserI   	traceback
format_exctotal_secondsrY   track_eventset)Z
target_urltypesZ
result_keyr   r   r   Ztest_cases_localZtest_cases_filename_localZuploads_dirZtest_cases_filepath_localffile_base_name
excel_fileZ
task_localZmongo_handler_localstructured_test_datai	test_casestepsZurl_key_finalmer   r   generation_durationr   Ztracking_errorZgen_errr)   r)   r*   _run_url_generation_async  s    






	("(.
  
"

z+generate.<locals>._run_url_generation_asyncZqueuedzQueued URL generation for z with types: )targetr:   daemonr   FzFailed to access URL: zError processing URL content: z"=== IMAGE SOURCE TYPE DETECTED ===zRequest form data: Z	imageFilezNo imageFile in request.fileszNo image file uploadedzImage file received: zEmpty filename receivedzNo selected file%Y%m%d_%H%M%Sr      testsZimagesr   r   r   zGenerating z test cases from imager   

zFailed to generate zError generating z test cases from image: exc_infoapi keyZauthorizationr_   r`   z test cases: z(Failed to generate test cases from imageZmodel_not_foundZinvalid_request_errorzThe OpenAI model required for image processing is not available or has been deprecated. Please check your OpenAI account access.zJOpenAI API authentication failed. Please check your API key configuration.Ztest_image_)txtexcelz	TC_KAN-1_   )test_case_idcontentrK   default_section)r   r   image_idr   r   r   z,Failed to track image test case generation: )r8   r   fileszFailed to save test case fileszImage processing error: zN. Please ensure the image is clear and in a supported format (JPG, PNG, JPEG).ziThe OpenAI model required for image processing is not available. Please check your OpenAI account access.quota
rate limitzBOpenAI API quota exceeded or rate limited. Please try again later.Zjiraz$Processing request for source_type: zRaw item_ids from request: zProcessed item_ids: z	 (count: )zSelected test types: zLarge batch detected: z  items. Processing in batches...   zMedium batch detected: z items.zSmall batch: zProcessing item_id: jira_configz!Fetching Jira issue for item_id: zFailed to fetch Jira issue for zVFailed to fetch Jira issue. Please check your credentials and ensure the issue exists.zJira connection error for zJira connection error: z Successfully fetched Jira issue r[   r   fieldsdescriptionsummaryzIssue c              
      s   zVt | tr| W S t | trTd| krTg   fdd|  ddd  D W S W n8 tk
r } ztd d|  W 5 d }~X Y nX d	S )
Nr   c                    sb   t | tr| dnd }|dkr6d| kr6 | d  t | trL| dg ng D ]}| qPd S )Nr   textr   )r   dictr;   r   )nodeZ	node_typechildZ
text_partswalkr)   r*   r     s
    z=generate.<locals>.extract_jira_description_text.<locals>.walkr   c                 S   s   g | ]}|r|qS r)   r)   )r   tr)   r)   r*   
<listcomp>  s      zCgenerate.<locals>.extract_jira_description_text.<locals>.<listcomp>z%Failed to parse Jira description for ru   ri   )r   rJ   r   r   rI   rA   re   )desc_e)r   r   r*   extract_jira_description_text  s    
(z/generate.<locals>.extract_jira_description_textz test cases for )r   r   r   r   zProgress update: r#   z = z.1f%zSuccessfully generated zNo test cases generated for z for Zazurez=== AZURE SECTION ENTERED ===azure_configzAzure config received: zAzure config type: zAzure config keys: z
Not a dictzAzure config values: zUsing frontend Azure config: )r  z,Using environment variables for Azure configzReason: azure_config exists: z, all values present: 
last_errorz,Failed to fetch work item from Azure DevOps.zAzure client error for item zAzure DevOps connection error: titlez%No test cases generated for item_id: z, skipping file creationzGenerated test cases for z, saving files...c                 s   s"   | ]}|  s|d kr|V  qdS ))-r   N)isalnum)r   cr)   r)   r*   r     s       test_)r   r   r   zSuccessfully saved files for z: txt=z, excel=zFailed to save files for zFinal results: z	 (total: z items)z%No results generated for any item IDsz7No Azure DevOps work items were successfully processed.)r7   errors_by_itemz+No Jira issues were successfully processed.zTFailed to process the uploaded image. Please ensure the image is clear and readable.zEFailed to generate test cases. Please check your input and try again.r   ZTC_)r   r   r   item_idsz&Failed to track test case generation: )r8   r   r   r	  zError during generation: )r   r   r
  r   r   )N)YrA   rB   r   is_jsonjsonrI   r7   r	   formr   r   keysr   itemsfilenamehasattrr   rv   seekr;   rx   r   rJ   r   
startswithsplitr   verify_jwt_tokenre   r   r   rY   remote_addrr   r   r   r   stripr   allschemenetlocrequestsstatus_coderG   r   uuidZuuid4	threadingr   ThreadstartRequestExceptionr'   r(   r   r   r   r   r   r   splitextsaveai.image_generatorr   removeadd
ValueErrorlowerexistsr   r   r   r   r   r   extendr   r   copyr   r   r   valuesr   rH   Zfetch_azure_work_itemsr  r   )FdatarL   r[   filecurrent_userauth_headerr5   r<   	user_infor   r   r   r
  r   r   
parsed_urlresponseZ	url_errorr   Zimport_errorr   r  r   r  r   Z
image_fileZ	unique_idZimage_storageZfile_extZstored_filenameZ
image_pathr   r   Zall_types_processedZerror_messagesr   Ztype_test_caseZcompletion_keyrV   msgr   txt_filer   rh   Zformatted_test_casesidxr   r   Ztest_case_sectionsr   section_namesection_contentparsed_casesr   r   r	  r   issuer   Zraw_descriptionZsummary_textr   Zdescription_textZprogressr  azure_client
work_items	error_msgZ	work_itemZsafe_filenamer)   )r   r   r*   generate   s"   
*
 6
&
$
$&



$

 $
0
 
$,
0
6



0

(








0





  
&




$$$,







: 


((
,



:



 $






"
  

*
r>  z/api/download/<path:filename>c              
      s  z.zNt  }d| d| kr&| dd nddtjdtjd g dd}|| W n6 tk
r } zt	d	t
|  W 5 d }~X Y nX tjt}tj|d
d}tj|stj|dd td|  tj|| }td|  tj|st	d|  td|  g }tj|rTt|D ]}| |kr8|| q8|r|d } tj|| }td|   n"t	d|   tddidfW S tjd}	tjd}
|	r| drzt|	}td|  dd l}||}d}| D ]@\}}|dd}|r||kr|| |j|df< |d7 }qtd| d  | d! |j d"d# |
rt d|
d$}nt dd%}t  fd&d'}W nV tk
r } z6t	d(|  |
rt|d|
d$}nt|dd%}W 5 d }~X Y nX nh|	rJ| d)rJzt|	}td*|  t!|d+d,d-}|" }W 5 Q R X | d. t! d/d,d-J}|#| |#d0 |$ D ]&\}}|r|#| d1| d2 qW 5 Q R X |
rt d|
d$}nt dd%}t  fd3d'}W nV tk
rF } z6t	d4|  |
r*t|d|
d$}nt|dd%}W 5 d }~X Y nX n"|
r`t|d|
d$}nt|dd%}zhd5| d| kr| dd ndtj|rtj%|nd|
d6tjdtjd g dd}|| W n8 tk
r } zt	d7t
|  W 5 d }~X Y nX d8|jd9< d:|jd;< d<|jd=< |W S  tk
r| } z,t	d>|  tdt
|id?f W Y S d }~X Y nX d S )@NZfile_download_attempted.rw   )r  	file_typer   r   r   r   r   r   r   r   r   z"Failed to track download attempt: r   	generatedTr   Created generated directory: zAttempting to download file: File not found: zSearching for file in: Found matching file: zNo matching files found for: r7   File not foundra   rK   r  .xlsxz(Updating Excel file with status values: r   ri   Statusr|   zUpdated z rows with status valuesz
.temp.xlsxF)r+   as_attachmentZdownload_name)rK  c              
      sR   zt j rt   W n2 tk
rL } ztd|  W 5 d }~X Y nX | S NzError removing temp file: r   r   r)  r%  rI   rA   r7   r3  rL   Ztemp_file_pathr)   r*   remove_temp_file  s    "z'download_file.<locals>.remove_temp_filez)Error updating Excel with status values: r   z&Updating TXT file with status values: rr   r   z	.temp.txtr   z

# STATUS VALUES
ru   r   c              
      sR   zt j rt   W n2 tk
rL } ztd|  W 5 d }~X Y nX | S rL  rM  rN  rO  r)   r*   rP    s    "z'Error updating TXT with status values: Zfile_download_successful)r  rA  	file_sizecustom_filenamez%Failed to track successful download: z#no-cache, no-store, must-revalidateCache-Controlno-cachePragma0ExpireszError downloading file: rP   )&r   r  r   r   r;   r  r   rI   rA   r7   rJ   r   r   r   r   r   r)  r   rB   listdirr   r	   r:   endswithr  loadspandas
read_exceliterrowsatZto_excelr
   r   r   rv   r   r  getsize)r  r<   r   rL   base_dirgenerated_dir	file_pathmatching_filesr.  status_valuesrS  status_dictpddfupdated_countr+   rowr  r3  rP  r   r   rK   r)   rO  r*   download_file  s    
&



"



$ 
&


rk  z/api/files/<url_key>c              
   C   s  zt d|   t }|jd| i}|sPt d|   tddidfW S g }d|krt|d tr|d }d|krt|d tr|d 	 D ]>\}}t|trd	|kr|
|d	  d
|kr|
|d
  qd|krt|d tr||d  |s|dd}|dd}|r|rtjtjtdd}tj|rt|D ]2}	||	krR|	dsx|	drR|
|	 qRt dt| d|  d|  td|iW S  tk
r }
 z:t jd|  dt|
 dd tdt|
idf W Y S d}
~
X Y nX dS )z+Get list of files associated with a URL keyzRequested files for URL key: r   No document found for URL key: r7   Document not foundra   r   r   r   r   r   ri   r   r   rC  rH  r   zFound z files for URL key ru   z Error getting files for URL key Tr   rP   N)rA   rB   r   rc   rd   r7   r	   r   r   r  r   r   r*  r;   r   r   r   r   r   r)  rY  rZ  r   rI   rJ   )r   r<   docr   r   r   	file_infor   ra  r  rL   r)   r)   r*   get_files_for_url_key@  sB    
" rp  z/api/ai-content/<url_key>c                 C   sZ  zt d|   t }|jd| i}|sPt d|   tddidfW S d|krt|d tr|d }d|kr|d }t|t	rtd	|iW S t|t
rtd	d
dd |D iW S d|krt|d tr|d }d|krt|d tr|d  D ]\}}t|trd|krzrtjtjtdd}tj||d }tj|rt|ddd}	|	 }W 5 Q R X td	|iW   W S W n> tk
r }
 zt d|d  d|
  W 5 d}
~
X Y nX qt d|   tddidfW S  tk
rT }
 z:t jd|  dt	|
 dd tdt	|
idf W Y S d}
~
X Y nX dS )z&Get AI-generated content for a URL keyz"Requested AI content for URL key: r   rl  r7   rm  ra   r   r   r   r   c                 S   s   g | ]}t |qS r)   )rJ   )r   itemr)   r)   r*   r     s     z"get_ai_content.<locals>.<listcomp>r   r   r   rC  rQ  r   r   zCould not read file ru   Nz!No AI content found for URL key: zNo AI content foundz%Error getting AI content for URL key Tr   rP   )rA   rB   r   rc   rd   r7   r	   r   r   rJ   r   r   r  r   r   r   r   r)  r   rv   rI   re   )r   r<   rn  r   r   r   ro  ra  rc  r   rL   r)   r)   r*   get_ai_contentx  sD    

0rr  z!/api/results/<url_key>/test-casesc                 C   sv  zt d|   t }|jd| i}|sPt d|   tddidfW S d|krxt|d trxtd|d iW S d|krt|d t	r|d }d|krt|d trt
|d d	krtd|d iW S d
|krt|d
 t	r|d
  D ]\}}t|t	rd|krztjtjtdd}tj||d }tj|rd	dl}||}	g }
|	 D ]L\}}i }|	jD ],}|| }||rd||< n|||< q~|
| ql|
rtd|
iW   W S W q tk
r } zt d|d  d|  W 5 d}~X Y qX qd|krt|d trzd	dlm}m} ||d }|rg }| D ] \}}|||d}|| qb|rtd|iW W S n"||d }|rtd|iW W S W n4 tk
r } zt d|  W 5 d}~X Y nX t d|   tddidfW S  tk
rp } z:t jd|  dt| dd tdt|idf W Y S d}~X Y nX dS )z!Get test cases data for a URL keyz"Requested test cases for URL key: r   rl  r7   rm  ra   r   r   r   r   r   r   rC  NCould not read Excel file ru   r   r   r   #Could not parse test cases string: z!No test cases found for URL key: zNo test cases foundz%Error getting test cases for URL key Tr   rP   rA   rB   r   rc   rd   r7   r	   r   r   r   r   r  r   r   r   r   r   r)  r\  r]  r^  columnsisnar   rI   re   rJ   utils.file_handlerr   r   r*  r   r<   rn  r   r   ro  ra  rc  rg  rh  recordsr+   rj  recordcolumnvaluerL   r   r   sectionsZall_parsed_casesr7  r8  Zsection_casesr9  r)   r)   r*   get_test_cases_for_url_key  sp    &


."r  z/api/ai-tests/<url_key>c                 C   sv  zt d|   t }|jd| i}|sPt d|   tddidfW S d|krxt|d trxtd|d iW S d|krt|d t	r|d }d|krt|d trt
|d d	krtd|d iW S d
|krt|d
 t	r|d
  D ]\}}t|t	rd|krztjtjtdd}tj||d }tj|rd	dl}||}	g }
|	 D ]L\}}i }|	jD ],}|| }||rd||< n|||< q~|
| ql|
rtd|
iW   W S W q tk
r } zt d|d  d|  W 5 d}~X Y qX qd|krt|d trzd	dlm}m} ||d }|rg }| D ] \}}|||d}|| qb|rtd|iW W S n"||d }|rtd|iW W S W n4 tk
r } zt d|  W 5 d}~X Y nX t d|   tddidfW S  tk
rp } z:t jd|  dt| dd tdt|idf W Y S d}~X Y nX dS )zGet AI test cases for a URL keyz Requested AI tests for URL key: r   rl  r7   rm  ra   r   r   r   r   r   r   rC  Nrs  ru   rt  r   ru  zNo AI tests found for URL key: zNo AI tests foundz#Error getting AI tests for URL key Tr   rP   rv  rz  r)   r)   r*   get_ai_tests_for_url_key  sp    &


."r  z/api/content/<path:filename>c              
   C   s  z,t d|   | dks$| d krHt d|  d tddidfW S tjt}tj|dd	}tj	|stj
|d
d t d|  tj|| }t d|  tj	|sLt d|  g }tj	|rt|D ]}| |kr|| q|r*|d } tj|| }t d|   n"t d|  tddidfW S | dr~dd l}dd l}dd l}t d|   z||}	t dt|	 dt|	j  tjd}
i }|
rz||
}t d|  W n4 tk
r } zt d|  W 5 d }~X Y nX g }|	 D ]\}}i }|	jD ],}|| }||rXd ||< n|||< q6|dd}|r||kr|| |d< d|krt|d tr|d }td|rt d |}d!d" |D }|r||d< || q$t d#|  d$t| d% |r4t|d&kr
t!|d " s
t #d' |j|d d(}t|d&kr
d)d" |j$d D }g }t%d&t|D ]d}i }t&|D ]F\}}|t|jk r|j$||f }||rd ||< n|||< q|| q|r
t d*t| d+|  |}td,|iW W S  tk
rz } zBt jd-|  d.t| d
d/ tdd0t| id1f W Y W S d }~X Y nX nzNt'|d2d3d4}|( }W 5 Q R X t d5|  d6t| d7 td,|iW W S  tk
r* } z>t d8|  d.t|  tdd9t| id1f W Y W S d }~X Y nX W nZ tk
r } z:t jd:|  d.t| d
d/ tdt|idf W Y S d }~X Y nX d S );NzRequested content for file: Z	undefinedzInvalid filename: ''r7   zInvalid filename providedrb   r   rC  Tr   rD  zLooking for file at: z+File not found at exact path, searching in r   rF  rE  rG  ra   rH  zReading Excel file: z"Excel file read successfully with z rows and columns: rK   z#Applying status values to content: zError parsing status values: r   ri   rI  r   z^\d+\.z\n\s*\d+\.|\nc                 S   s   g | ]}|  r|  qS r)   )r  )r   sr)   r)   r*   r     s      z$get_file_content.<locals>.<listcomp>zConverted Excel file z to  recordsr|   z@No valid records found in Excel file, checking for column issues)headerc                 S   s   g | ]}t | qS r)   )rJ   r  )r   hr)   r)   r*   r     s     zManually extracted z records with headers: r   zError processing Excel file ru   r   zError processing Excel file: rP   rQ  r   r   zSuccessfully read text file:  (z characters)zError reading text file zError reading text file: zError in get_file_content for ))rA   rB   r7   r	   r   r   r   r   r   r)  r   rY  r   rZ  r\  Znumpyr  r]  r   r   rw  r   r:   r;   r[  rI   r^  rx  r   rJ   researchr  anyr,  re   Zilocranger   r   rv   )r  ra  rb  rc  rd  r.  rg  Znpr  rh  re  rf  rL   r{  r+   rj  r|  r}  r~  r  Z
steps_textr   raw_datar   Zmanual_recordsr   jr  r   r   r)   r)   r*   get_file_content_  s    
 
"

&

 
46r  z/api/update-statusc                  C   sR  zt j} td|   | d}| d}| d}| dd}|sZtddid	fW S |sptdd
id	fW S |stddid	fW S | dkrtddid	fW S t }|j	d|i}|sd| }t
| td|idfW S ||||}|r|jd|idd| |d| t dt ii}	|rd|krt|d trt|d D ]R\}
}|d|krZ|jd|idd|
 d|ii td|
   qqZtd| d tddiW S d| d| }t
| td|idfW S W nP tk
rL } z0t
d t|  tdt|id!f W Y S d }~X Y nX d S )"Nz Received status update request: r[   r   rK   Zshared_viewFr7   zMissing required parameter: keyrb   z(Missing required parameter: test_case_idz"Missing required parameter: statusri   zStatus cannot be emptyr   z No document found with url_key: ra   $setzstatus.zstatus_timestamps.status_updated_atr   r   
test_data..Statusz(Updated status in test_data array index z+Successfully updated status for test case 'r  r8   Tz&Failed to update status for test case z in document zError updating status: rP   )r   r  rA   rB   r;   r	   r  r   rc   rd   r7   Zupdate_test_case_status
update_oner   r   r   r   r   rI   rJ   )r-  r   r   rK   is_shared_viewr<   rn  r=  r8   resultr   tcrL   r)   r)   r*   update_status  sh    




    

r  z
/api/sharec               
   C   s  z^d } t jd}|r|drz8|dd }t }||}|rX|drX|d } W n6 tk
r } zt	dt
|  W 5 d }~X Y nX t jrt j}nPt j }| D ]<\}}t|t
r|drzt|||< W q   Y qX qtd	|  |d
}	|d}
|dg }|di }|d}|	sNtddidfW S t }|svtd tddidfW S |rt|dkr||	t|dkr|d n||| r| d nd }n||	|
|| r| d nd }|r@z&||| td| d|  W n4 tk
r> } ztd|  W 5 d }~X Y nX ddlm} t jdrndt jd }nt jdrt jdrt jdd}| d t jd }nTt jdrt jdd!st jdd"sdt jd }n
|d#}| d$| }td% td&t jd  td't jd  td(t jd  td)|  td*|  td+|  td,t j  td-t j  z^d.||t|	trt|	ndt||rt|ndd/t jd0t jd g dd1}| | W n8 tk
rN } ztd2t
|  W 5 d }~X Y nX td3||d4W S  tk
r } z0td5t
|  tdt
|idf W Y S d }~X Y nX d S )6Nry   rz   r{   r|   r8   r}   r~   {zShare request data: r   r   r
  re  r   r7   zNo test data providedrb   zMongoDB handler not initializedzDatabase connection errorrP   r   r   zSaved status values for ru   zError saving status values: )BASE_URLzX-Forwarded-Hosthttps://zX-Forwarded-ProtoZHosthttpsz://r   	localhostr#   z/view/zURL generation details:z  - X-Forwarded-Host: z  - X-Forwarded-Proto: z
  - Host: z  - BASE_URL from settings: z  - Selected base_url: z  - Generated share URL: z  - Request URL: z  - Request base URL: Zshare_created_successfully)r   	share_urlZtest_data_countZhas_status_valuesZstatus_values_countr   rB  z+Failed to track successful share creation: T)r8   r  r   zError in share_test_case: )!r   r   r;   r  r  r   r  rI   rA   re   rJ   r  r  r  to_dictr  r   r[  rB   r	   r7   r   r   Zupdate_status_dictconfig.settingsr  rstripr   base_urlr   rH   r  r   )r/  r0  r5   Zauth_mongo_handlerr1  rL   r-  r[   r~  r   r   r
  re  r   r<   r   r  r  protocolr  r   r)   r)   r*   share_test_case9  s    
&




6"6


&
r  z/view/<url_key>c              
   C   st  zzBt  }d| tjdddtjdtjd g dd}|| W n6 tk
r| } zt	dt
|  W 5 d }~X Y nX tjdd	 }|d
k}|| }|s|rtddidfW S tddfW S | |d< d|kr*t|d trtd|  dt|d  d nt|d tr\d|d kr\|d d |d< tdt|d  d nt|d tr*d|d kr*zt|d di }|d}|r tjtjtdd|}	tj|	r dd l}
|
|	}|d}||d< tdt| d t|d tsd|kr|d}|rtjtjtdd|}tj|rt|ddd }| }W 5 Q R X dd!lm }m!} ||}g }|r|" D ] \}}|||d"}|#| qn||}|r||d< td#t| d W n8 tk
r( } zt	d$t
|  W 5 d }~X Y nX d%|krt|d% trt|d tr|d% }|d&i }|d D ]L}d'|krp|d' |krp||d'  |d(< |d' |krp||d'  |d)< qp|rd*|krt
|d* |d*< t|W S td+|d,W S W nv tk
rn } zVtj	d-t
| d.d/ |d
krJtdt
|id0f W Y S tddf W Y S W 5 d }~X Y nX d S )1NZshared_page_visitedr"   html)r   r"   r   r   rB  z!Failed to track view page visit: ri   r  r7   Test case not foundra   z404.htmlr[   r   zTest data for z is already a list with  itemsr   z Extracted test_cases array with r   r   r   rC  r{  zParsed Excel file into r  r   rQ  r   r   )r   r   r   zParsed text file into z!Error processing files for view: rK   r]   r   rI  ZStatusUpdatedAtr\   z	view.html)r   z Error in view_shared_test_case: Tr   rP   )$r   r   r:   r;   r   r  r   rI   rA   r7   rJ   r(  get_test_caser	   r   r   r   rB   r   r   r   r   r   r   r   r)  r\  r]  r  r   rv   ry  r   r   r  r*  )r   r<   r   rL   Zformat_paramZ	want_jsonr   r   r   Z
excel_pathrg  rh  Zstructured_datar5  Ztxt_pathr   Ztxt_contentr   r   r  r7  r8  r9  rf  r]   r  r)   r)   r*   view_shared_test_case  s    
&

$



&*


r  z/api/shared/excel/<url_key>c              
   C   s  zvt | }|s$tddidfW S tjd}tjd}i }|rz(||}tdt	| d|  W q t
k
r } ztd|  W 5 d }~X Y qX n
td	 |s|d
rd|d
  d}nd| d d  d}|d
rd|d
  }nd| d d  }|d }dd l}d}	t }
d}|D ]b}|	d7 }	d|krb|dd}|	d| d7 }	d|kr|	d|dd d7 }	d|kr|dd}|	d7 }	t|trt|D ]"\}}|	|d  d| d7 }	qn|	d| d7 }	d|kr|	d|dd d7 }	|dd}d}|rJ||krJ|| }|
| |d7 }n|dd}|	d | d!7 }	d"|kr|	d#|d"d d7 }	|	d!7 }	q.td$| d% |	d&7 }	| D ]$\}}|r|	| d'| d7 }	q|	}dd(lm} |||}|stdd)id*fW S tjtjtd+d,|}t|d-|d.}d/|jd0< d1|jd2< d3|jd4< t||jd5< tt |jd6< |W S  t
k
r } z0td7t|  tdt|id*f W Y S d }~X Y nX d S )8Nr7   r  ra   r  rK   zSHARED EXCEL: Received z status values: z+SHARED EXCEL: Error parsing status values: z'SHARED EXCEL: No status values providedr   r  rH  Ztest_shared_r   r   r   ri   zTEST CASE:
r   zTitle: r   r   z
Scenario: r   zSteps to reproduce:
r|   z. z1. r   zExpected Result: rI  zStatus: r   ZPriorityz
Priority: zSHARED EXCEL: Updated z test cases with status valuesz

# STATUS SUMMARY
ru   )r   zFailed to generate Excel filerP   r   rC  TrJ  .no-cache, no-store, must-revalidate, max-age=0rT  rU  rV  rW  rX  zX-Status-Updated-CountzX-Status-Update-TimezError generating Excel file: )r<   r  r	   r   r:   r;   r[  rA   rB   r   rI   r7   r  r   r   r   r   r&  r  ry  r   r   r   r   r   r   r
   r   rJ   r   r'   )r   r   rS  re  rf  r  rL   r   r   Zformatted_dataZstatus_updatedri  r  r  r   r   steprK   Ztest_data_strr   r   rc  r3  r)   r)   r*   download_shared_excel+  s    

$














r  z/api/generation-statusc                  C   s0  zt d  d} t d r4tt d tt d  d } t| sF| dk rLd} n| dkrXd} t d tt d tt d | t d  t ddt d	dtt d
g t ddd	}td|d   W 5 Q R X t|W S  t	k
r* } z6t
dt|  tt|dddddf W Y S d }~X Y nX d S )Nrq   r   rl   rk   r   rj   rm   ri   rn   ro   r   )	rj   rk   rl   rp   files_readyrm   rn   ro   r   z,Generation status response - final_url_key: z!Error getting generation status: FT)r7   rp   rj   r  rP   )r   r   mathisnanr   r;   rA   rB   r	   rI   r7   rJ   )rp   r3  rL   r)   r)   r*   get_generation_status  s0    






r  z/api/shared-statusGETc               
   C   s  zt jd} t jdd dk}| s<tddidfW S td|   t }|j| d	d
}|d krztddidfW S d	|t	t
 d}|r||jd| i}|r|||d< d|kr|d|d kr|d d |d< |d d }|rnt| }td|  ||d< d|kr |d= d|d krT|d d |d< td|d   nd|d< td ||d< z4ddlm} g }	| D ]\}
}td|
  d|krTt|d t	rT|d }td|
 dt| d ||}|rB|D ](}d |kr|d   d!|
 d|d < q|	| td"t| d#|
  ntd$|
  ntd%|
  q|	r|	|d< td&t|	 d' t|W W S td( W nP tk
r } z0td)|  dd l}td*|   W 5 d }~X Y nX nhd|krt|d trtd+|dd, d- |d |d< |dd.krxd.|krx|d. g|d< td/|d.   n$|dd0krd1g|d< td2 ||d< td3t|d  d4 t|W S d|krbt|d trbtd5|dd, d- |d }|dd6krd|kr|d d.krtd7 d|krbt|d trb|d |d< |d |d< |d.d8|d.< |d.d8g|d< ||d< td3t|d  d9 t|W S n|dd:krbd|krb|d d0krbtd; d|krbt|d trb|d |d< |d |d< |d<d8|d<< d1g|d< ||d< td3t|d  d= t|W S d|d kr`t|d d tr`|d d }td>t| d? g }|D ]}t|trd@|kr|d@d8}|rt|t	rddlm} ||}|r|| n*|dAdBdCdDdE|dFdGdH}|| q|r|||d< tdIt| dJ nt|d tr||d |d< t|}dK|jdL< dM|jdN< dO|jdP< |W S  tk
r } z0tdQt	|  tdt	|idRf W Y S d }~X Y nX d S )SNr[   ZincludeFilesfalsetruer7   Missing URL key parameterrb   z$Fetching shared status for URL key: T)Zforce_refreshr  ra   )r8   re  r&   r   rg   r   r   zExtracted item IDs from files: r
  r   r   zAdded source_type to document: ZJirazUsing default source_type: Jirar   )r   zProcessing file: r   zFound test cases content for z
 (length: r   r   r  zSuccessfully parsed z test cases from zNo test cases parsed from zNo test_cases string found in zSuccessfully combined z  total test cases from all filesz No test cases found in any filesz%Error parsing test cases from files: Traceback: z Found direct test_data list for rw   z source typer   zSet URL as item_id: r   zUploaded Imagez!Set Image item_id: Uploaded ImagezSuccessfully loaded z! test cases from direct test_dataz Found nested test_data dict for )Nri   r   z$Found URL data with nested structureri   z% URL test cases from nested structure)Nri   r   z&Found Image data with nested structurer   z' Image test cases from nested structurezFound test_cases list with r  r   r   r   zScenario extracted from contentzSteps extracted from contentz&Expected result extracted from contentrK   z
Not Tested)r   r   r   r   rI  zSuccessfully converted z% test cases from test_cases structurer  rT  rU  rV  rW  rX  z Error retrieving shared status: rP   )r   r:   r;   r(  r	   rA   rB   r   Zget_test_case_status_valuesrJ   r   r'   rc   rd   r   r  ry  r   r  r   r   r*  re   rI   r   r   r   r   r   r7   )r   Zinclude_filesr<   re  response_datarn  Z
files_datar
  r   Zall_test_casesZfile_keyZ	file_dataZtest_cases_contentZparsed_test_casesr  rL   r   Znested_test_dataZtest_cases_listZconverted_test_casesr   parsedr   r3  r)   r)   r*   get_shared_status  s   





*








"




r  z/api/analytics/trackc            
      C   s~  z&t j} | s tddidfW S | d| di | dt jdt j| d| d	g | d
dd}t jd}|r|drzT|dd }t }|	|}|r|dr|d }|d|d< |d|d< W n t
k
r   Y nX t }||}|rtdddW S tddidfW S W nP t
k
rx }	 z0tdt|	  tdt|	idf W Y S d}	~	X Y nX dS )z"Track user events and interactionsr7   No data providedrb   r   r   r   r   r   r   r   r   r   ry   rz   r{   r|   r8   r}   r   r   r   r   TzEvent tracked successfullyr8   r@   zFailed to track eventrP   zError tracking analytics: N)r   r  r	   r;   r   r  r  r  r   r  rI   r   rA   r7   rJ   )
r-  r   r0  r5   mhverificationZ
event_userr<   r8   rL   r)   r)   r*   track_analytics	  sB    





r  z/api/analytics/sessionc            
   
   C   sr  zt j} | s tddidfW S | dt jdt jt jd| d| d| d	d
}t jd}|r|drzT|dd }t }|	|}|r|dr|d }|d|d< |d|d< W n t
k
r   Y nX t }||}|rtdddW S tddidfW S W nP t
k
rl }	 z0tdt|	  tdt|	idf W Y S d}	~	X Y nX dS )z"Track user session and page visitsr7   r  rb   r   r   ZRefererpage_visitedcountrycity)r   r   r   Zreferrerr  r  r  ry   rz   r{   r|   r8   r}   r   r   r   r   TzSession tracked successfullyr  zFailed to track sessionrP   zError tracking session: N)r   r  r	   r;   r   r  r  r  r   r  rI   Ztrack_user_sessionrA   r7   rJ   )
r-  Zsession_datar0  r5   r  r  r}   r<   r8   rL   r)   r)   r*   track_session	  s@    



r  z/api/analytics/summaryc               
   C   s~  z&t jd} t }d}| rp| drpz2| dd }||}|rX|drX|d }W n tk
rn   Y nX |stdd	d
dfW S t j	d}t j	d}t j	d}t j	jddt
d}|}	|ddkr|	j||||d}
n|	j|||||dd}
|
rtd|
dW S tddidfW S W nP tk
rx } z0tdt|  tdt|idf W Y S d}~X Y nX dS )zMGet analytics summary with RBAC: admin gets system-wide, users get their own.ry   Nrz   r{   r|   r8   r}   FAuthentication requiredr    
start_dateend_dater   r    r   )r   r   admin)r  r  r    r   r   )r  r  r    r   r   Tr8   r-  r7   zFailed to get analytics summaryrP   z!Error getting analytics summary: )r   r   r;   r   r  r  r  rI   r	   r:   intget_analytics_summaryrA   r7   rJ   )r0  r  r/  r5   r1  r  r  r   r    r<   r   rL   r)   r)   r*   r  	  sN    
r  z/api/analytics/detailedc               
   C   sr  zt jd} | r| ds2tddddfW S t }| dd }||}|rp|d	rp|d
 ddkrtddddfW S i }t jd}|rz8t	|dkrt
|d|d< nt
|dd|d< W n, tk
r   t
|dd d|d< Y nX t jd}|rzRt	|dkrJt
|dtdd tdd }||d< nt
|dd|d< W nF tk
r   t
|dd dtdd tdd }||d< Y nX t jd}|r||d< t jd}	|	r|	|d< t }
|
|}|dk	rtd|dW S tddidfW S W nP tk
rl } z0tdt|  tdt|idf W Y S d}~X Y nX dS ) z0Get detailed analytics with filters. Admin only.ry   rz   Fr  r  r  r{   r|   r8   r}   r   r  	Forbidden  r  r   %Y-%m-%dZ+00:00Nr  r   )Zmillisecondsr   r   Tr  r7   z Failed to get detailed analyticsrP   z"Error getting detailed analytics: )r   r   r;   r  r	   r   r  r  r:   r   r   strptimefromisoformatreplacerI   r   get_detailed_analyticsrA   r7   rJ   )r0  r  r5   r  filtersr  r  Zend_dtr   r   r<   eventsrL   r)   r)   r*   r  4
  sT    
  
(

r  z/api/test-cases/recentc               
   C   s>  zt jd} | r| ds0tddddfW S t }| dd }||}|r\|d	sptdd
ddfW S |d d }|j|dd}|r|D ]4}d|krt	|d |d< d|kr|d 
 |d< qtd|dW S tdg dW S W nN tk
r8 } z.tdt	|  tddddf W Y S d}~X Y nX dS )z0Get recent test cases for the authenticated userry   rz   Fr  r  r  r{   r|   r8   zInvalid tokenr}   r   r   )limitr\   r   T)r8   r   z!Error getting recent test cases: zFailed to retrieve test casesrP   N)r   r   r;   r  r	   r   r  r  get_user_test_casesrJ   rY   rI   rA   r7   )r0  r  r5   r1  r   r   r  rL   r)   r)   r*   get_recent_test_casesr
  s8    

r  z/api/analytics/errorsc               
   C   s  z|t jd} | r| ds2tddddfW S t }| dd }||}|rp|d	rp|d
 ddkrtddddfW S ddlm	} t j
d}t j
d}t j
d}|r,|r,z0t|d}t|d}	|	| j}
t|
d}W n8 tk
r( } ztd|  d}W 5 d}~X Y nX ntt j
dd}|j||||d}d|krptd|d idfW S td|dW S  tk
r } z0tdt|  tdt|idf W Y S d}~X Y nX dS )z-Get error analytics from MongoDB (admin only)ry   rz   Fr  r  r  r{   r|   r8   r}   r   r  r  r  r   )error_loggerr  r  r!   r  r   z1Error parsing date range, using default 30 days: Nr    )r    r!   r  r  r7   rP   Tr  zError getting error analytics: )r   r   r;   r  r	   r   r  r  utils.error_loggerr  r:   r   r  r    maxrI   rA   re   r  Zget_error_summaryr7   rJ   )r0  r  r5   r  r  r  r  r!   Zstart_datetimeZend_datetimeZ	days_diffr    rL   Zerror_summaryr)   r)   r*   get_error_analytics
  sF    
 

r  z/api/mongo-document/<url_key>c              
   C   s
  z| st ddidfW S td|   t }|jd| i}|sR|jd| i}|sht ddidfW S d|krt|d |d< d	|d
}t |}d|jd< d|jd< d|jd< |W S  tk
r } z0t	dt|  t dt|idf W Y S d}~X Y nX dS )z%Get MongoDB document content directlyr7   r  rb   z)Retrieving MongoDB document for URL key: r   r\   rm  ra   T)r8   rg   r  rT  rU  rV  rW  rX  z#Error retrieving MongoDB document: rP   N)
r	   rA   rB   r   rc   rd   rJ   r   rI   r7   )r   r<   rn  r  r3  rL   r)   r)   r*   get_mongo_document
  s.    


r  z/api/notify-status-changec               
   C   s
  zt jd} t jd}t jd}| s<tddidfW S td|  d| d	|  tjd
| idt	
 ||t	
 ddi tddd}d|jd< d|jd< d|jd< |W S  tk
r } z0tdt|  tdt|idf W Y S d }~X Y nX d S )Nr[   Z
testCaseIdrK   r7   r  rb   z,Received status change notification for key=z, testCaseId=z	, status=r   r  )r   rK   r&   )r  Zlast_status_changeTz#Status change notification receivedr  r  rT  rU  rV  rW  rX  z-Error processing status change notification: rP   )r   r:   r;   r	   rA   rB   r<   rc   r  r   r   r   rI   r7   rJ   )r   r   rK   r3  rL   r)   r)   r*   notify_status_change
  s:    


r  z/api/debug/force-syncc            
   
   C   st  zt jd} | s&tddidfW S t }|jd| i}|sRtddidfW S t|dt}i }|rt	|d D ],\}}|d	d
}|dd
}|rv|||< qvt	|d D ]B\}}|d	d
}||kr|j
d| idd| d|| ii qnd|krd|d krt	|d d D ]@\}}|d	|dd
}|d|dd
}|r|||< qt	|d d D ]N\}}|d	|dd
}||krp|j
d| idd| d|| ii qp|r|j
d| idd|ii |j
d| idt |ddd di tdd||dW S  tk
rn }	 z0tdt|	  tdt|	idf W Y S d}	~	X Y nX dS )z;Debug endpoint to force sync of status values between viewsr[   r7   r  rb   r   rm  ra   r   r   ri   rI  r  r  r  r   r  rK   ztest_data.test_cases.z.statusstatus_force_sync_countr   r|   )Zstatus_force_synced_atr  TzStatus values forced to sync)r8   r@   re  r  zError during force sync: rP   N)r   r:   r;   r	   r   rc   rd   r   r   r   r  r   r'   rI   rA   r7   rJ   )
r   r<   rn  r  Zupdated_statusr   r  r  rK   rL   r)   r)   r*   debug_force_sync'  sr    



r  z/healthc               
   C   s8  zd} zt rt j  nd} W n0 tk
rN } zdt| } W 5 d}~X Y nX d}z:tjt}tj	|dd}tj
|stj|dd W n0 tk
r } zdt| }W 5 d}~X Y nX td	t  | |td
rdnddW S  tk
r2 } z(tdt|t  ddf W Y S d}~X Y nX dS )z*Health check endpoint for cloud deploymentZOKzNot initializedr   Nr   rC  Tr   ZhealthyZRENDER
productionZdevelopment)rK   r&   ZmongodbZ
filesystemZenvironmentZ	unhealthy)rK   r7   r&   rP   )r<   rc   rd   rI   rJ   r   r   r   r   r   r)  r   r	   r   r'   rY   getenv)Zmongo_statusrL   Z	fs_statusra  rb  r)   r)   r*   health_check  s>      


r  z/api/verify-api-keyc               
   C   s  ddl } ddl}z2ddlm} |r4|dks4|dkrJtdddd	d
fW S ddl m} ||d}z|j }|rdd |jD }dd |D }|rtdd|dW W S tddd|dd ddfW W S ntdddd	d
fW W S W n\ t	k
r@ } z<t
dt|  tddt| dd	d
f W Y W S d}~X Y nX W n t	k
r }	 zvt|	}
d}d|
 ksd |
 krd!}n&d"|
 krd#}nd$|
 krd%}tdd&|
 |d	d
f W Y S d}	~	X Y nX dS )'zJ
    Endpoint to verify if the OpenAI API key is configured correctly
    r   N)OPENAI_API_KEYZyour_openai_api_key_hereZmissing_api_keyr7   z$OpenAI API key is missing or invalidzWPlease configure a valid API key in your .env file. The API key should start with "sk-")rK   r@   detailsrb   )OpenAI)Zapi_keyc                 S   s   g | ]
}|j qS r)   )r   r   Zmodelr)   r)   r*   r     s     z"verify_api_key.<locals>.<listcomp>c                 S   s2   g | ]*}| d rd|ks*|d ks*|dkr|qS )zgpt-4oZvisionzgpt-4o-mini)r  r  r)   r)   r*   r     s    
  r8   z0API key is valid and vision models are available)rK   r@   Zavailable_vision_modelsre   z3API key is valid but no vision models are availablez?Your OpenAI account may not have access to gpt-4o Vision modelsr   )rK   r@   r  available_modelsrF   zCould not validate API keyz4API responded without error but no data was returnedzError validating API key: zAPI verification failed: z5There was an error verifying your API key with OpenAIzHCheck that your API key is valid and your account has sufficient creditsZauthenticationr   z'Invalid API key or authentication issuer   zARate limited by OpenAI. Try again later or check your usage tier.r   zNYou have exceeded your quota. Check your billing settings on OpenAI dashboard.zAPI key verification failed: )openair  r  r  r	   r  Zmodelsr   r-  rI   rA   r7   rJ   r(  )r  r  r  r  clientr3  r  Zvision_modelsZ	api_errorrL   rV   Zerror_detailsr)   r)   r*   verify_api_key  s    



 r  z/setup-helpc                   C   s   t dddS )z5Page with setup instructions and API key verificationr_   z1This page helps you configure your OpenAI API keyr`   r,   r)   r)   r)   r*   
setup_help  s    r  z/api/shorten-urlc               
   C   sf  zt j} td|   | s:td tddidfW S t }| d}| d}| d}|s~td tdd	idfW S |rt|d
krtd| d |j	
||dd}|rtd|d   tdd|d  iW S || }td|  tdd| iW S  tk
r` } z0tdt|  tdt|idf W Y S d }~X Y nX d S )Nz$Received URL params for shortening: zNo URL parameters providedr7   rb   r[   r   r
  zNo files parameter in URL datazNo files parameter providedr   zFound long key z!, checking for existing short URLZshortened_url)zurl_params.fileszurl_params.item_idsr   zFound existing short URL: r\   z/results?token=z"Generated new short URL with key: zError creating shortened URL: rP   )r   r  rA   rB   r7   r	   r   r;   r   rc   rd   Zsave_url_datarI   rJ   )r^   r<   Zexisting_keyr   r
  Zexisting_docrf   rL   r)   r)   r*   shorten_url  sF    




 
 r  z/api/verify-jirac               
   C   s.  zt j} | dd }| dd }| dd }|rD|rD|sXtddddfW S |d	sjd
| }ddlm} ||||}| }|rt	
d|dd  tdd|dddW S tddddfW S W nR tk
r( } z2t	dt|  tdt|ddf W Y S d}~X Y nX dS )z&Verify Jira connection and credentialsjiraUrlri   jiraUser	jiraTokenFMissing required fieldsr8   r7   rb   zhttp://r  r  r   
JiraClientz%Jira connection successful for user: ZdisplayNamer   TConnection successful)r8   r@   r}   z Could not authenticate with Jirar  zJira verification error: rP   N)r   r  r;   r  r	   r  jira.jira_clientr  Zget_current_userrA   rB   rI   r7   rJ   )r-  jira_url	jira_user
jira_tokenr  jira_clientr1  rL   r)   r)   r*   verify_jira_connection2  s.    


r  z/api/test-urlc               
   C   s<  zt j} | dd }|s0tddddfW S ztt|}t|j|jgs`tddddfW W S t	j|dd	}|j
d
krtdddW W S tddd|j
fW W S W n< t	jk
r } ztddddf W Y W S d}~X Y nX W nR tk
r6 } z2tdt|  tdt|ddf W Y S d}~X Y nX dS )zTest if a URL is accessibler   ri   Fr   r  rb   r   r   )r   rF   TzURL is accessibler  zURL is not accessiblezFailed to connect to URLNzURL test error: rP   )r   r  r;   r  r	   r   r  r  r  r  r  r!  rI   rA   r7   rJ   )r-  r   r2  r3  rL   r)   r)   r*   test_urlW  s$    
.r  z/api/verify-azurec            	   
   C   sD  zt j} | dd }| dd }| dd }| dd }|rX|rX|rX|sltdddd	fW S |d
s~d| }ddlm} ||||}||}|rt	
d|dd  tdd|dddW S tddddfW S W nR tk
r> } z2t	dt|  tdt|ddf W Y S d}~X Y nX dS )z.Verify Azure DevOps connection and credentialsazureUrlri   azureOrgazureProjectazurePatFr  r  rb   r  r  r   r   z)Azure connection successful for project: namer   Tr  )r8   r@   Zprojectz(Could not authenticate with Azure DevOpsr  zAzure verification error: rP   N)r   r  r;   r  r	   r  azure_integration.azure_clientr   get_projectrA   rB   rI   r7   rJ   )	r-  	azure_url	azure_orgazure_project	azure_patr   r;  project_inforL   r)   r)   r*   verify_azure_connectionu  s0    



r  z/api/fetch-jira-itemsc               
   C   s  zHt j} | dd }| dd }| dd }|rF|rF|sZtddddfW S |d	sld
| }ddlm} ||||}ddddg}|jd|d}|r4g }|D ]`}	|	|	dd|	di dd|	di di dd|	di di ddd qt
dt| d td|dW S tdddd fW S W nR tk
r }
 z2t
d!t|
  tdt|
dd"f W Y S d}
~
X Y nX dS )#z'Fetch recent Jira items for suggestionsr  ri   r  r  Fr  r  rb   r  r  r   r  zTo DoReady for QAzReady for QazReady For QAN)r  Zstatusesr[   r   r   Z	issuetyper   ZIssuerK   r   r  r   rK   Fetched z Jira items for suggestionsTr8   r  zNo issues foundra   zError fetching Jira items: rP   )r   r  r;   r  r	   r  r  r  Zget_recent_issuesr   rA   rB   r   rI   r7   rJ   )r-  r  r  r  r  r  Zdesired_statusesZissuesr  r:  rL   r)   r)   r*   fetch_jira_items  sF    



r  z/api/fetch-azure-itemsc                  C   s  zdt j} td|   | dd }| dd }| dd }| dd }td| d| d	| d
|rdt| nd  |r|r|r|stdt| dt| dt| dt|  t	ddddfW S |
dsd| }ddlm} ||||}||_td|  ||}|s^td|  t	dd| dddfW S td|d|  td | d! d"d#d$d%g}|j|d&|d'}	td(|	rt|	nd d) |	rPg }
|	D ]V}|
t|d*d|d+i d,d|d+i d-d.|d+i d/dd0 qtd1t|
 d2 t	d3|
d4W S t	dd5dd6fW S W n tk
r } zbtd7t|  td8t|  dd&l}td9|   t	dt|dd:f W Y S d&}~X Y nX d&S );z4Fetch recent Azure DevOps work items for suggestionszReceived Azure data: r  ri   r  r  r  zProcessed Azure fields - URL: 'z	', Org: 'z', Project: 'z', PAT: *rt   zMissing Azure fields - URL: z, Org: z, Project: z, PAT: Fr  r  rb   r  r  r   r   zTesting Azure project access: z Failed to access Azure project: zCannot access project z . Please check your permissions.r  z%Successfully accessed Azure project: r   z'Fetching Azure work items for project: z with QA-ready filtersr	  zRe-openZReopenedz	Re-openedN)r  Zstatesz
Retrieved z Azure work itemsr   r   zSystem.TitlezSystem.WorkItemTypez	Work ItemzSystem.Stater
  r  z! Azure work items for suggestionsTr  zNo work items foundra   zError fetching Azure items: zError type: r  rP   )r   r  rA   rB   r;   r  r   r7   rH   r	   r  r  r   r  r  Zget_recent_work_itemsr   rJ   rI   r   r   r   )r-  r  r  r  r  r   r;  r  Zdesired_statesr<  r  rq  rL   r   r)   r)   r*   fetch_azure_items  sf    22

 
r  z/api/export-excelc               
   C   s>  zt j} | stddidfW S | dg }| di }| dd}| dg }|sdtdd	idfW S td
t| d|  ddlm} |||||}t	
 d}d| d| d}ddlm}	 |	|ddd| did}
|
W S  tk
r8 } z6tdt|  tddt| idf W Y S d}~X Y nX dS )zExport test cases to Excel filer7   r  rb   r   re  r   r   r
  zNo test cases providedz
Exporting z test cases to Excel for r   )create_excel_reportr   Ztest_cases_r   rH  ResponsezAapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetContent-Dispositionzattachment; filename=""Zmimetyper   zError exporting to Excel: zExport failed: rP   N)r   r  r	   r;   rA   rB   r   ry  r  r   r'   r(   flaskr  rI   r7   rJ   )r-  r   re  r   r
  r  Z
excel_datar&   r  r  r3  rL   r)   r)   r*   export_excel  s2    r  z/api/auth/signupc               
   C   sN  zt j} | s tddddfW S | dd }| dd }| dd}|r\t|d	k rptdd
ddfW S |r|d|krtddddfW S |rt|dk rtddddfW S t }||||}|d rtdddW S td|d ddfW S W nN tk
rH } z.t	
dt|  tddddf W Y S d}~X Y nX dS )zHandle user registrationFr  r  rb   r   ri   r9   passwordr   z'Name must be at least 2 characters long@$Please provide a valid email addressr   z+Password must be at least 8 characters longr8   Tz-Account created successfully! Please sign in.r@   zError in signup API: z%An error occurred during registrationrP   N)r   r  r	   r;   r  r   r   Zcreate_userrI   rA   r7   rJ   )r-  r   r9   r  r<   r  rL   r)   r)   r*   
signup_apiA  s0    
r  z/api/auth/signinc               
   C   s   zt j} | s tddddfW S | dd }| dd}|rD|sXtddddfW S t }|||}|d	 rtd
d|d |d dW S td|d ddfW S W nL tk
r } z.t	dt
|  tddddf W Y S d}~X Y nX dS )zHandle user loginFr  r  rb   r9   ri   r  zEmail and password are requiredr8   TzLogin successful!r5   r}   )r8   r@   r5   r}   r@   r  zError in signin API: zAn error occurred during loginrP   N)r   r  r	   r;   r  r   Zauthenticate_userrI   rA   r7   rJ   )r-  r9   r  r<   r  rL   r)   r)   r*   
signin_apig  s*    
r  z/api/auth/dashboardc                  C   sf  zt jd} | r| ds2tddddfW S | dd }t }||}|r^|d	srtdd
ddfW S |d d }||}t	|}t
 j}t
 j}d}	d}
|r|D ]}|d}|rzFt|trt
|dd}n|}|j|kr|j|kr|	d7 }	W q tk
rZ } z,td|d dt|  W Y qW 5 d}~X Y qX qzVt|dd d}|dr|d }t|trt
|dd}n|}|d}
W n< tk
r } ztdt|  d}
W 5 d}~X Y nX ||	|
d}td||dW S  tk
r` } z2tjdt| dd  tdd!dd"f W Y S d}~X Y nX dS )#zGet user dashboard datary   rz   FAuthorization token requiredr  r  r{   r|   r8   Invalid or expired tokenr}   r   r   ZNeverr   r  r  z#Failed to parse date for test case r\   ru   Nc                 S   s   |  dtjS )Nr   )r;   r   min)xr)   r)   r*   <lambda>      zdashboard_api.<locals>.<lambda>)r[   z	%B %d, %Yz&Failed to determine latest test case: r   )totalZ
this_monthlast_generatedT)r8   r   statszError in dashboard API: r   z)An error occurred while loading dashboardrP   )r   r   r;   r  r	   r  r   r  r  r   r   r'   monthyearr   rJ   r  r  rI   rA   re   r  r(   r7   )r0  r5   r<   r1  r   r   Ztotal_countZcurrent_monthZcurrent_yearZthis_month_countr$  r  r   Zparsed_daterL   ZlatestZ	last_dater%  r)   r)   r*   dashboard_api  sh    





 
r(  /api/auth/reset-passwordc            	   
   C   s  zdt j} | s"tddddfW S | dd }|r>d|krRtddddfW S t }|jd|i}|s|td	d
dW S ||}|d st	
d| d|dd  td	d
dW S zLddlm} |||d |d d}|rt	d|  nt	
d|  W n> tk
rF } zt	
d| dt|  W 5 d}~X Y nX t	d|  td	ddW S  tk
r } zPt	
dt|  t|d| r| ddndd tddddf W Y S d}~X Y nX dS ) zHandle password reset requestFr  r  rb   r9   ri   r  r  TzJIf an account with that email exists, a password reset link has been sent.r8   z!Failed to create reset token for ru   r@   Unknown errorr   )send_password_reset_emailr5   
expires_at)r9   Zreset_tokenr,  z+Password reset email sent successfully to: z(Failed to send password reset email to: z&Error sending password reset email to Nz$Password reset requested for email: zcIf an account with that email exists, a password reset link has been sent. Please check your email.zError in reset password API: r)  )rU   r9   'An error occurred during password resetrP   )r   r  r	   r;   r  r   Zusers_collectionrd   Zcreate_password_reset_tokenrA   r7   rQ   r+  rB   rI   rJ   r   )	r-  r9   r<   r}   r=   r+  Z
email_sentZemail_errorrL   r)   r)   r*   reset_password_api  sT    


,
"r.   /api/auth/reset-password-confirmc               
   C   s  zFt j} | s"tddddfW S | dd }| dd }| dd }|sjtdd	ddfW S |stdd
ddfW S t|dk rtddddfW S ||krtddddfW S t }|||}|d rt	d|dd  d tdddW S t
d|dd  d|dd  td|ddddfW S W nx tk
r } zXtdt|  t|d| r| dddd ndd tddddf W Y S d}~X Y nX dS )z"Handle password reset confirmationFr  r  rb   r5   ri   new_passwordconfirm_passwordzReset token is requiredzNew password is required   z+Password must be at least 6 characters longzPasswords do not matchr8   z1Password reset successfully completed for token: Nr   z...TzHPassword reset successfully. You can now sign in with your new password.z!Password reset failed for token: z... - r@   r*  zFailed to reset passwordz%Error in reset password confirm API: r/  )rU   r5   r-  rP   )r   r  r	   r;   r  r   r   Zuse_password_reset_tokenrA   rB   re   rI   r7   rJ   r   )r-  r5   r0  r1  r<   r  rL   r)   r)   r*   reset_password_confirm_api  sD    

&

*r3  z/api/auth/system-overviewc               
   C   s  zt jd} | r| ds0tddddfW S | dd }t }||}|r\|d	sptdd
ddfW S |d d }||}|d	 rt|W S td|d ddfW S W nN t	k
r  } z.t
dt|  tddddf W Y S d}~X Y nX dS )z Get system overview (admin only)ry   rz   Fr  r  r  r{   r|   r8   r  r}   r   r@   r  zError in system overview API: z/An error occurred while loading system overviewrP   N)r   r   r;   r  r	   r  r   r  Zget_system_overviewrI   rA   r7   rJ   )r0  r5   r<   r1  r   Zsystem_overviewrL   r)   r)   r*   system_overview_apiL  s"    


r4  z/api/auth/recent-usersc               
   C   s(  zt jd} | r| ds0tddddfW S | dd }t }||}|r\|d	sptdd
ddfW S |d d }||}|d	 rd|kr|d dd ng }td|dW S td|d ddfW S W nN t	k
r" } z.t
dt|  tddddf W Y S d}~X Y nX dS )zGet recent users (admin only)ry   rz   Fr  r  r  r{   r|   r8   r  r}   r   usersNr   T)r8   r5  r@   r  zError in recent users API: z,An error occurred while loading recent usersrP   )r   r   r;   r  r	   r  r   r  Zget_all_usersrI   rA   r7   rJ   )r0  r5   r<   r1  r   r5  Zrecent_usersrL   r)   r)   r*   recent_users_apil  s*    


r6  z/api/auth/all-usersc            	   
   C   s.  zt jd} | r| ds0tddddfW S | dd }t }||}|r\|d	sptdd
ddfW S |d d }tt j	dd}tt j	dd}|
|||}|d	 rt|W S td|d ddfW S W nN tk
r( } z.tdt|  tddddf W Y S d}~X Y nX dS )z*Get all users with pagination (admin only)ry   rz   Fr  r  r  r{   r|   r8   r  r}   r   pageper_pager   r@   r  zError in all users API: z%An error occurred while loading usersrP   N)r   r   r;   r  r	   r  r   r  r  r:   Zget_all_users_paginatedrI   rA   r7   rJ   )	r0  r5   r<   r1  r   r7  r8  r5  rL   r)   r)   r*   all_users_api  s&    

r9  z/api/auth/system-healthc               
   C   s  zt jd} | r| ds0tddddfW S | dd }t }||}|r\|d	sptdd
ddfW S |d d }||}|d	 rt|W S td|d ddfW S W nN t	k
r  } z.t
dt|  tddddf W Y S d}~X Y nX dS )z%Get system health status (admin only)ry   rz   Fr  r  r  r{   r|   r8   r  r}   r   r@   r  zError in system health API: z.An error occurred while checking system healthrP   N)r   r   r;   r  r	   r  r   r  Zget_system_healthrI   rA   r7   rJ   )r0  r5   r<   r1  r   ZhealthrL   r)   r)   r*   system_health_api  s"    


r:  z/api/auth/user-analyticsc               
   C   s  zt jd} | r| ds0tddddfW S | dd }t }||}|r\|d	sptdd
ddfW S |d d }||}|d	 rt|W S td|d ddfW S W nN t	k
r  } z.t
dt|  tddddf W Y S d}~X Y nX dS )z(Get detailed user analytics (admin only)ry   rz   Fr  r  r  r{   r|   r8   r  r}   r   r@   r  zError in user analytics API: z.An error occurred while loading user analyticsrP   N)r   r   r;   r  r	   r  r   r  Zget_detailed_user_analyticsrI   rA   r7   rJ   )r0  r5   r<   r1  r   Z	analyticsrL   r)   r)   r*   user_analytics_api  s"    


r;  z/api/auth/create-userc               
   C   s(  zt jd} | r| ds0tddddfW S | dd }t }||}|r\|d	sptdd
ddfW S |d d }t  }|stddddfW S |	||}|d	 rt|W S td|d ddfW S W nN t
k
r" } z.tdt|  tddddf W Y S d}~X Y nX dS )zCreate a new user (admin only)ry   rz   Fr  r  r  r{   r|   r8   r  r}   r   r  rb   r@   zError in create user API: z%An error occurred while creating userrP   N)r   r   r;   r  r	   r  r   r  get_jsonZcreate_user_by_adminrI   rA   r7   rJ   r0  r5   r<   r1  r   r-  r  rL   r)   r)   r*   create_user_api  s(    

r>  z/api/auth/export-datac            
   
   C   sL  zt jd} | r| ds0tddddfW S | dd }t }||}|r\|d	sptdd
ddfW S |d d }||}|d	 rddl	m
} ddlm} |j|d dd}||dddt d didW S td|d ddfW S W nN tk
rF }	 z.tdt|	  tddddf W Y S d}	~	X Y nX dS )zExport system data (admin only)ry   rz   Fr  r  r  r{   r|   r8   r  r}   r   r   r  )	json_utilr-  r   )indentzapplication/jsonr  z#attachment; filename=system-export-z%Y%m%dz.jsonr  r@   r  zError in export data API: z&An error occurred while exporting datarP   N)r   r   r;   r  r	   r  r   r  Zexport_system_datar  r  Zbsonr?  dumpsr   r'   r(   rI   rA   r7   rJ   )
r0  r5   r<   r1  r   Zexport_resultr  r?  payloadrL   r)   r)   r*   export_data_api  s4    

 rC  z/api/auth/system-logsc               
   C   s  zt jd} | r| ds0tddddfW S | dd }t }||}|r\|d	sptdd
ddfW S |d d }||}|d	 rt|W S td|d ddfW S W nN t	k
r  } z.t
dt|  tddddf W Y S d}~X Y nX dS )zGet system logs (admin only)ry   rz   Fr  r  r  r{   r|   r8   r  r}   r   r@   r  zError in system logs API: z+An error occurred while loading system logsrP   N)r   r   r;   r  r	   r  r   r  Zget_system_logsrI   rA   r7   rJ   )r0  r5   r<   r1  r   ZlogsrL   r)   r)   r*   system_logs_apiD  s"    


rD  z/api/auth/backup-systemc               
   C   s  zt jd} | r| ds0tddddfW S | dd }t }||}|r\|d	sptdd
ddfW S |d d }||}|d	 rt|W S td|d ddfW S W nN t	k
r  } z.t
dt|  tddddf W Y S d}~X Y nX dS )z!Create system backup (admin only)ry   rz   Fr  r  r  r{   r|   r8   r  r}   r   r@   r  zError in backup system API: z'An error occurred while creating backuprP   N)r   r   r;   r  r	   r  r   r  Zcreate_system_backuprI   rA   r7   rJ   )r0  r5   r<   r1  r   Zbackup_resultrL   r)   r)   r*   backup_system_apid  s"    


rE  z/api/auth/system-settingsc               
   C   s(  zt jd} | r| ds0tddddfW S | dd }t }||}|r\|d	sptdd
ddfW S |d d }t  }|stddddfW S |	||}|d	 rt|W S td|d ddfW S W nN t
k
r" } z.tdt|  tddddf W Y S d}~X Y nX dS )z#Update system settings (admin only)ry   rz   Fr  r  r  r{   r|   r8   r  r}   r   r  rb   r@   zError in system settings API: z)An error occurred while updating settingsrP   N)r   r   r;   r  r	   r  r   r  r<  Zupdate_system_settingsrI   rA   r7   rJ   r=  r)   r)   r*   system_settings_api  s(    

rF  z /api/auth/user-details/<user_id>c              
   C   s  zt jd}|r|ds0tddddfW S |dd }t }||}|r\|d	sptdd
ddfW S |d d }||| }|d	 rt|W S td|d ddfW S W nN t	k
r } z.t
dt|  tddddf W Y S d}~X Y nX dS )zGet user details (admin only)ry   rz   Fr  r  r  r{   r|   r8   r  r}   r   r@   r  zError in user details API: z,An error occurred while loading user detailsrP   N)r   r   r;   r  r	   r  r   r  Zget_user_detailsrI   rA   r7   rJ   )r   r0  r5   r<   r1  admin_user_idr  rL   r)   r)   r*   user_details_api  s"    

rH  z/api/auth/update-user/<user_id>PUTc           	   
   C   s*  zt jd}|r|ds0tddddfW S |dd }t }||}|r\|d	sptdd
ddfW S |d d }t  }|stddddfW S |	|| |}|d	 rt|W S td|d ddfW S W nN t
k
r$ } z.tdt|  tddddf W Y S d}~X Y nX dS )zUpdate user (admin only)ry   rz   Fr  r  r  r{   r|   r8   r  r}   r   r  rb   r@   zError in update user API: z%An error occurred while updating userrP   N)r   r   r;   r  r	   r  r   r  r<  Zupdate_user_by_adminrI   rA   r7   rJ   )	r   r0  r5   r<   r1  rG  r-  r  rL   r)   r)   r*   update_user_api  s(    

rJ  ra   c                 C   s>   t dtj  tjdr.tddidfS tddddfS )	zHandle 404 Not Found errorsz404 error: /api/r7   zAPI endpoint not foundra   r_   zNThe page you're looking for doesn't exist. Please check the URL and try again.r`   rA   re   r   r   r   r  r	   r   r6   r)   r)   r*   not_found_error  s    rM  rP   c                 C   s@   t dt|   tjdr0tddidfS tddddfS )	z!Handle 500 Internal Server errorsz500 error: rK  r7   zInternal server error occurredrP   r_   z8Something went wrong on our end. Please try again later.r`   )rA   r7   rJ   r   r   r  r	   r   r6   r)   r)   r*   internal_error  s    rN  r  c                 C   s>   t dtj  tjdr.tddidfS tddddfS )	zHandle 403 Forbidden errorsz403 error: rK  r7   zAccess forbiddenr  r_   z2You don't have permission to access this resource.r`   rL  r6   r)   r)   r*   forbidden_error  s    rO  rb   c                 C   s>   t dtj  tjdr.tddidfS tddddfS )	zHandle 400 Bad Request errorsz400 error: rK  r7   zBad requestrb   r_   z?The request was invalid. Please check your input and try again.r`   rL  r6   r)   r)   r*   bad_request_error
  s    rP  c                 C   sZ   z@d| j krd| j d< d| j kr*d| j d< d| j kr>d| j d< W n tk
rT   Y nX | S )NrT  r  rV  rU  rX  rW  )r   rI   )r3  r)   r)   r*   add_global_no_cache_headers  s    




rQ  __main__z0.0.0.0i  )hostport)r  r   r   r   r   r   r  r   r   r	   r
   r   r   Z
flask_corsr   r  r   r  r   Zai.generatorr   r$  r   ry  r   r   r   r   Zutils.mongo_handlerr   r   r  r   r   r  r  loggingr  urllib.parser   r  r   	functoolsr   __name__appenvironr;   configbasicConfigINFO	getLoggerrA   Zrouter+   r-   r.   r/   r0   r1   r2   r4   r>   r?   rC   rM   rR   rZ   rh   r   r   r>  rk  rp  rr  r  r  r  r  r<   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r(  r.  r3  r4  r6  r9  r:  r;  r>  rC  rD  rE  rF  rH  rJ  ZerrorhandlerrM  rN  rO  rP  Zafter_requestrQ  runr)   r)   r)   r*   <module>   st   














(

       $
 >
7
4
X
X
 
H
|
t
x

 Z
-
,
:
=
*
5
&
,
^
&
N

0
$

%
2
I
(
%
 
Q
A
/

$
#


$
)


$

%





