
    Bi                          S r SSKrSSKJr  SSKJr  SSKJrJrJr  SSK	J
r
Jr  SSKJr  SSKJr  SS	KJrJrJrJrJrJr  SS
KJrJr  SSKJrJr  \R:                  " \5      r " S S5      r g)z2
PDF report generator for SonarQube scan results.
    N)Path)datetime)DictOptionalList)letterA4)inch)colors)SimpleDocTemplateTable
TableStyle	ParagraphSpacer	PageBreak)getSampleStyleSheetParagraphStyle)	TA_CENTERTA_LEFTc                   \    \ rS rSrSrSS\4S jjr  SS\S\S\\   S	\\   S
\	4
S jjr
Srg)ReportGenerator   z2Generates PDF reports from SonarQube scan results.reports_dirc                 X    [        U5      U l        U R                  R                  SSS9  g)z\
Initialize report generator.

Args:
    reports_dir: Directory where reports will be saved
T)parentsexist_okN)r   r   mkdir)selfr   s     0C:\wamp64\www\sonar_scan\src\report_generator.py__init__ReportGenerator.__init__   s*      ,td;    N	repo_namescan_resultssonar_resultsscan_outputreturnc                    [         R                  " 5       R                  S5      nU SU S3nU R                  U-  n[        R                  SU 35         [        [        U5      [        S[        -  S[        -  S[        -  S[        -  S9n/ n	[        5       n
[        SU
S   S	[        R                  " S
5      S[        S9n[        SU 3U5      nU	R!                  U5        U	R!                  [#        SS[        -  5      5        U	R!                  [        SU
S   5      5        SU/S[         R                  " 5       R                  S5      /SUR%                  S5      (       a  SOS//nUR%                  S5      (       a  UR!                  SUS   /5        UR%                  S5      (       a  UR!                  SUS   /5        ['        US[        -  S[        -  /S9nUR)                  [+        S S!S"[        R,                  4S#S!S$[        R.                  4S%S&S'S(S S)S*[        R0                  4S+S!S*S[        R2                  4/5      5        U	R!                  U5        U	R!                  [#        SS,[        -  5      5        U(       Ga  UR%                  S-5      (       a  U	R!                  [        S.U
S   5      5        US-   nUS/:X  a  [        R4                  O[        R6                  nSU//n['        US[        -  S[        -  /S9nUR)                  [+        S S!S"[        R,                  4S#S0S0U4S%S&S'S(S S)S*[        R0                  4S+S!S*S[        R2                  4/5      5        U	R!                  U5        U	R!                  [#        SS,[        -  5      5        U(       Gao  UR%                  S15      (       GaX  U	R!                  [        S2U
S   5      5        US1   nS3S4//nU Hc  nUR%                  S5S65      nUR%                  S7S85      nUR9                  SS95      R;                  5       nUR!                  U[        U5      /5        Me     [=        U5      S:  a  ['        US:[        -  S:[        -  /S9nUR)                  [+        S S!S$[        R,                  4S#S!S$[        R.                  4S%S&S'S(S S)S*[        R0                  4S+S!S*S[        R2                  4/5      5        U	R!                  U5        U	R!                  [#        SS,[        -  5      5        UR%                  S5      (       du  U	R!                  [        S;U
S   5      5        UR%                  S<S=5      n[        S>U 3U
S?   5      nU	R!                  U5        U	R!                  [#        SS[        -  5      5        U(       a  U	R!                  [?        5       5        U	R!                  [        S@U
S   5      5        SAn[=        U5      U:  a	  USBU SC-   nOUn[        SDU SE3[        SFU
SF   SGSH95      nU	R!                  U5        URA                  U	5        [        R                  SIU 35        U$ ! [B         a  n[        RE                  SJU 35        e SBnAff = f)Ka  
Generate PDF report for a scan.

Args:
    repo_name: Repository name
    scan_results: Scan execution results dictionary
    sonar_results: SonarQube API results (optional)
    scan_output: Raw scanner output (optional)
    
Returns:
    Path to generated PDF file
z%Y%m%d_%H%M%S_z.pdfzGenerating PDF report: g      ?)pagesizerightMargin
leftMargin	topMarginbottomMarginCustomTitleHeading1   z#0891b2   )parentfontSize	textColor
spaceAfter	alignmentzSonarQube Scan Report:    g?zScan InformationHeading2
Repositoryz	Scan Datez%Y-%m-%d %H:%M:%SStatussuccessSuccessFailedtask_idzTask IDanalysis_idzAnalysis ID      )	colWidths
BACKGROUNDr   r   )r   	TEXTCOLORrF   r   )ALIGNrE   rF   rF   LEFT)FONTNAMErE   rH   zHelvetica-Bold)FONTSIZErE   rH      )BOTTOMPADDINGrE   rH   rN   )r   r8   rJ   GRIDg333333?quality_gatezQuality Gate StatusOK)r8   r   metricszCode MetricsMetricValuemetric valuezN/A    zError DetailserrorzUnknown error occurredz<b>Error:</b> NormalzScan Outputi  Nz

... (output truncated)z<pre>z</pre>Code   )r3   r4   z#PDF report generated successfully: zFailed to generate PDF report: )#r   nowstrftimer   loggerinfor   strr   r
   r   r   r   HexColorr   r   appendr   getr   setStyler   grey
whitesmokebeigeblackgreenredreplacetitlelenr   build	Exceptionr[   ) r   r#   r$   r%   r&   	timestampfilenamefilepathdocelementsstylestitle_stylero   scan_info_datascan_info_table	qg_statusstatus_colorqg_dataqg_tablerS   metrics_datarV   metric_namemetric_valueformatted_namemetrics_table
error_text
error_paramax_output_lengthtruncated_outputoutput_paraes                                    r   generate_reportReportGenerator.generate_report   s    & LLN++O<	[)D1##h.-hZ89I	#H I9t)!$YC H )*F(j) //)4#K  7	{C[QEOOE"OOF1c$h/0 OOI&8&:LMNy)hlln556IJK(8(8(C(C9RN 	**%%y,y2I&JK..%%}l=6Q&RS#Nqvqv>NOO$$Zvw<fgv/@/@A3?16vx>1fll;	1 	& 	 OOO,OOF1c$h/0 !2!2>!B!B	*?
AS TU).9	/8D/@v||fjj$i01 QtVQtV4DE!!*!67FKK@ &&,?7C5:!68V\\BVXq&,,?	. 	# 	 )q#d( 34 !2!29!=!=	.&:L MN'	2!)7 34%F"(**Xr":K#)::gu#=L%0%8%8c%B%H%H%JN ''\9J(KL & |$q($),1T61T6BR$SM!**:%vwD$fgv7H7HI;G9>%vxF1fllC	7 	, 	 OOM2OOF1c$h$78  ##I..	/6*;M NO)--g7OP
&
|'DfXFVW

+q#d( 34 	,	-
9K LM$(!{#&77'23E4E'FIe'e$'2$',-V4"6&.1M , IIhKK=hZHIO 	LL:1#>?	s   W*Y   
Y(
Y##Y()r   )z	./reports)NN)__name__
__module____qualname____firstlineno____doc__rc   r    r   r   r   r   __static_attributes__ r"   r   r   r      sb    <<C < )-%)bb b  ~	b
 c]b 
b br"   r   )!r   loggingpathlibr   r   typingr   r   r   reportlab.lib.pagesizesr   r	   reportlab.lib.unitsr
   reportlab.libr   reportlab.platypusr   r   r   r   r   r   reportlab.lib.stylesr   r   reportlab.lib.enumsr   r   	getLoggerr   ra   r   r   r"   r   <module>r      sL       ' ' . $   a a D 2			8	$o or"   