
    i                          d Z ddlZddlmZ ddlmZ ddlmZmZmZ ddl	m
Z
mZ ddlmZ ddlmZ dd	lmZmZmZmZmZmZ dd
lmZmZ ddlmZmZ  ej:                  e      Z G d d      Z y)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                   L    e Zd ZdZddefdZ	 	 ddededee   dee   d	ef
d
Z	y)ReportGeneratorz2Generates PDF reports from SonarQube scan results.reports_dirc                 ^    t        |      | _        | j                  j                  dd       y)z
        Initialize report generator.
        
        Args:
            reports_dir: Directory where reports will be saved
        T)parentsexist_okN)r   r   mkdir)selfr   s     8/home/batmin/projects/sonar_scan/src/report_generator.py__init__zReportGenerator.__init__   s*      ,td;    N	repo_namescan_resultssonar_resultsscan_outputreturnc                    t        j                         j                  d      }| d| d}| j                  |z  }t        j                  d|        	 t        t        |      t        dt        z  dt        z  dt        z  dt        z        }g }	t               }
t        d|
d   d	t        j                  d
      dt              }t        d| |      }|	j!                  |       |	j!                  t#        ddt        z               |	j!                  t        d|
d                d|gdt        j                         j                  d      gd|j%                  d      rdndgg}|j%                  d      r|j!                  d|d   g       |j%                  d      r|j!                  d|d   g       t'        |dt        z  dt        z  g      }|j)                  t+        d d!d"t        j,                  fd#d!d$t        j.                  fd%d&d'd(d d)d*t        j0                  fd+d!d*dt        j2                  fg             |	j!                  |       |	j!                  t#        dd,t        z               |r|j%                  d-      r|	j!                  t        d.|
d                |d-   }|d/k(  rt        j4                  nt        j6                  }d|gg}t'        |dt        z  dt        z  g      }|j)                  t+        d d!d"t        j,                  fd#d0d0|fd%d&d'd(d d)d*t        j0                  fd+d!d*dt        j2                  fg             |	j!                  |       |	j!                  t#        dd,t        z               |rj|j%                  d1      rX|	j!                  t        d2|
d                |d1   }d3d4gg}|D ]b  }|j%                  d5d6      }|j%                  d7d8      }|j9                  dd9      j;                         }|j!                  |t        |      g       d t=        |      dkD  rt'        |d:t        z  d:t        z  g      }|j)                  t+        d d!d$t        j,                  fd#d!d$t        j.                  fd%d&d'd(d d)d*t        j0                  fd+d!d*dt        j2                  fg             |	j!                  |       |	j!                  t#        dd,t        z               |j%                  d      su|	j!                  t        d;|
d                |j%                  d<d=      }t        d>| |
d?         }|	j!                  |       |	j!                  t#        ddt        z               |r|	j!                  t?                      |	j!                  t        d@|
d                dA}t=        |      |kD  r	|dB| dCz   }n|}t        dD| dEt        dF|
dF   dGH            }|	j!                  |       |jA                  |	       t        j                  dI|        |S # tB        $ r}t        jE                  dJ|         dB}~ww xY w)Kac  
        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rD   r   )ALIGNrC   rD   rD   LEFT)FONTNAMErC   rF   zHelvetica-Bold)FONTSIZErC   rF      )BOTTOMPADDINGrC   rF   rL   )r   r6   rH   GRIDg333333?quality_gatezQuality Gate StatusOK)r6   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   )r1   r2   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	ExceptionrY   ) r   r!   r"   r#   r$   	timestampfilenamefilepathdocelementsstylestitle_stylerm   scan_info_datascan_info_table	qg_statusstatus_colorqg_dataqg_tablerQ   metrics_datarT   metric_namemetric_valueformatted_namemetrics_table
error_text
error_paramax_output_lengthtruncated_outputoutput_paraes                                    r   generate_reportz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(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	*?
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% MF"(**Xr":K#)::gu#=L%0%8%8c%B%H%H%JN ''\9J(KLM |$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X 	Y&X??Y)z	./reports)NN)
__name__
__module____qualname____doc__ra   r   r   r   r   r    r    r   r   r      s\    <<C < )-%)bb b  ~	b
 c]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   r_   r   r   r    r   <module>r      sN       ' ' . $   a a D 2			8	$o or    