
    4i]                     &   d Z ddlZddlZddlmZ ddlmZ ddlmZ ddlm	Z	m
Z
 ddlmZmZmZ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  ed      Z ed      Z ed      Z ed      Z ed      Z ed      Z  ed      Z! ed      Z" ed      Z# ed      Z$ ed      Z% ed      Z& ed      Z' ed      Z( ed      Z) ed      Z* ed      Z+ ed      Z, ed      Z- ed      Z. ed       Z/ ed!      Z0 ed"      Z1 ed#      Z2d$e3fd%Z4d$e3fd&Z5d$e3d'e6fd(Z7d)d*d+d,d-d.Z8d/d0d1d2d3d.Z9 ed       ed       ed       ed        ed      d.Z:d4 Z;	 	 dHd5e6d6e<d7e=d8e6d9e6d:e6d'e6fd;Z>d< Z?d= Z@d> ZAd? ZBd@ ZC	 dIdAe6dBeDdCeDdDeDdEeDdFe3fdGZEy)Ju   
pdf_generator.py — Premium branded "Business AI Score" PDF report with heatmap visuals.

Uses ReportLab to generate dark-themed, color-coded PDF reports with
gradient effects, score rings, recommendation cards, and strong CTAs.
    N)datetime)Optional)letter)inchmm)HexColorwhiteblackColor)canvas)	TA_CENTERTA_LEFTTA_RIGHT)	ParagraphFrame)ParagraphStylez#0B0C0Ez#141519z#1C1D24z#1E2028z#3B82F6z#2563EBz#1D4ED8z#172554z#F97316z#C2410Cz#8B5CF6z#06B6D4z#F8FAFCz#94A3B8z#CBD5E1z#64748Bz#EF4444z#7F1D1Dz#F59E0Bz#78350Fz#22C55Ez#14532Dz#2D2E36z#383944scorec                 :    | dk  rt         S | dk  rt        S t        S )z"Return color based on score range.!   B   )	SCORE_REDSCORE_YELLOWSCORE_GREENr   s    </mnt/e/genesis-system/scripts/heatmap_audit/pdf_generator.py_score_colorr   3   s"    {	"    c                 :    | dk  rt         S | dk  rt        S t        S )z;Return a dimmed version of the score color for backgrounds.r   r   )SCORE_RED_DIMSCORE_YELLOW_DIMSCORE_GREEN_DIMr   s    r   _score_color_dimr"   =   s"    {	"r   returnc                 L    | dk  ry| dk  ry| dk  ry| dk  ry| d	k  ry
| dk  ryy)zReturn text label for score.   Criticalr   Poor2   zBelow Averager   zNeeds ImprovementP   GoodZ   z	Very Good	Excellent r   s    r   _score_labelr.   G   sA    {	"	"	""	"	"r   zWebsite SpeedzMobile ExperiencezOnline Presencez
SEO BasicszAI Opportunitywebsite_speedmobile_experienceonline_presence
seo_basicsai_readinessSPEEDMOBILE
VISIBILITYSEOAIc                    | j                   |j                   | j                   z
  |z  z   }| j                  |j                  | j                  z
  |z  z   }| j                  |j                  | j                  z
  |z  z   }t        |||      S )z>Linearly interpolate between two ReportLab colors. t in [0,1].)redgreenbluer   )c1c2trgbs         r   _lerp_colorrD   s   so    
"&&266/Q&&A
BHHrxx'1,,A
277RWW$))AAq>r   business_namescoresrecommendationsoutput_path	phone_ctawebsite_urlc           
      &   t        j                  t         j                  j                  |      xs dd       t        \  }}t        j                  |t              }|j                  di       j                  dd      }	t        |||       t        |||       t        |||       |dz
  }
|j                  d	d
       |j                  t               |j                  d|
d       d|j                  dd	d
      z   d
z   }t!        d      D ]J  }t#        t        t$        |dz        }|j                  |       |j'                  ||dz  z   |
dz   ddd       L |
dz  }
|j                  dd       |j                  t(               | dd t+        |       dkD  rdndz   }|j                  d|
|       |
d
z  }
|j                  t               |j-                  d|
dddd       |j                  t.               |j-                  d|
dddd       |rB|
dz  }
|j                  d	d       |j                  t0               |j                  d|
|dd        |
dz  }
|j                  d	d       |j                  t2               |j                  d|
dt5        j6                         j9                  d               |
d!z  }
|
d"z
  }d#}|j                  t:               |j=                  d$||dz
  |d
dd       |j?                  t@               |jC                  d%       |j=                  d$||dz
  |d
dd       d&}||dz  z   }tE        |	      }tG        |	      }d'}t!        |dd(      D ]E  }d)|d*z  z   }t#        t:        |d+|z        }|j                  |       |j'                  |||dd       G |j                  tI        d,             |j'                  ||d-dd       |j?                  |       |jC                  d       |j'                  ||d-dd       |j?                  t@               |jC                  d%       |j'                  ||d.dd       |j                  dd$       |j                  t(               tK        |	      }|j                  |dd$      }|j                  ||dz  z
  |dz   |       |j                  d	d/       |j                  t0               d0}|j                  |d	d/      }|j                  ||dz  z
  |d1z
  |       d2}|d!z   }|j                  dd       |j                  t(               |j                  ||d3       |d4z  }|j                  dd1       |j                  |       |j                  ||tM        |	             |dz  }|j                  d	d       |j                  t0               |	d5k  rd6}n|	dk  rd7}n|	d8k  rd9}n
|	dk  rd:}nd;}|j                  |||       |d<z  }d=}||	dz  z  } |j                  tN               |j=                  |||d*ddd       |j                  |       |j=                  ||tQ        d|       d*ddd       |dz
  }
tS        |||
d>       |
d?z  }
g d@}!|!D ]  }"|j                  |"i       }#tU        |#tV              r|#j                  dd      nd}$tX        j                  |"|"      }%tZ        j                  |"d      }&tE        |$      }'t\        j                  |"t              }(|j                  t:               |j=                  d.|
dz
  |dAz
  dBd*dd       |j                  |(       |j                  |&ddC      d
z   })|j=                  dD|
dz   |)d<ddd       |j                  ddC       |j                  t(               |j                  dE|
dFz   |&       |j                  dd
       |j                  t(               |j                  dD|)z   dz   |
d*z   |%       |j                  ddG       |j                  |'       tK        |$      }*|j                  |*ddG      }+|j                  |d)z
  |+z
  |
d*z   |*       dD},|
d/z
  }-|dHz
  }.d
}/|j                  tN               |j=                  |,|-|.|/dIdd       tQ        d*|.|$dz  z        }0|j                  |'       |j=                  |,|-|0|/dIdd       |0d
kD  rFt#        |'t(        dJ      }1|j                  |1       |j=                  |,|0z   d'z
  |-dz   d'|/dz
  ddd       |
dKz  }
 |j                  dLi       }2|2j                  dM      }3|2j                  dN      }4|3r|4r|
d'z  }
dO}5|
|5z
  d
z   }6|j                  tI        dP             |j=                  d$|6|dz
  |5ddd       |j?                  t^               |jC                  dQ       |j=                  d$|6|dz
  |5ddd       |j                  t^               |j=                  d$|6d*|5ddd       |j                  dd       |j                  t^               |j                  d)|
d'z
  dR       |j?                  t^               |jC                  dQ       |j'                  dS|
dz
  dGdd       |j                  ddG       |j                  t^               |j                  dT|
dz
  dU|3        |j                  d	d       |j                  t`               |j                  dT|
d!z
  dV       dT|j                  dVd	d      z   }7|j                  dd
       |j                  t^               |j                  |7|
d!z
  dW|4 dX       |7|j                  dW|4 dXdd
      z   }8|j                  d	d       |j                  t`               |j                  dT|
dYz
  dZ       d[}9|j                  |9ddC      d/z   }:|dz
  |:z
  };|
dCz
  }<|j                  tb               |j=                  |;|<|:dddd       |j                  ddC       |j                  t(               |j                  |;d'z   |<d\z   |9       |6d
z
  }
te        ||       |jg                          t        |||       t        |||       t        |||       |dz
  }
tS        |||
d]       |
dz  }
ti        |dd*       D ]N  \  }}=|
d^k  r nC|=j                  d_d`      }>tU        |>tJ              r|>jk                         nda}?|?dbk(  rtl        }@tn        }Adc}9tl        }Bn-|?ddv rtp        }@tr        }Ade}9tp        }Bntt        }@tv        }Adf}9tt        }Bd.}C|dAz
  }Ddg}E|
|Ez
  dhz   }F|j                  t:               |j=                  |C|F|D|Eddd       |j?                  tx               |jC                  d%       |j=                  |C|F|D|Eddd       |j                  B       |j=                  |C|FdI|Eddd       |j                  |9ddC      d<z   }G|j                  A       |j=                  di|
dz   |Gdddd       |j                  ddC       |j                  @       |j                  dj|
d*z   |9       |=j                  dkd      }HtX        j                  |H|Hj{                  dldm      j}                               }I|j                  d	d       |j                  t2               |j                  di|Gz   dz   |
d*z   |I       |j                  dd       |j                  t2               dn|dz    }J|j                  |Jdd      }K|j                  |C|Dz   d<z
  |Kz
  |
d*z   |J       |j                  ddG       |j                  t(               |=j                  dod      }L|j                  di|
d<z
  |Lddp        |=j                  dq|=j                  drd            }M|j                  d	dG       |j                  t(               t        ||Mdi|
d?z
  |Dd$z
  dGds       |
|Ed<z   z  }
Q dt}Nd}O|j                  t               |j=                  du|Od*z
  |dOz
  |Nd
z   d<dd       |j                  t               |j=                  dv|O|dwz
  |Nd
dd       |j?                  t               |jC                  d       |j=                  dv|O|dwz
  |Nd
dd       |j                  t               |j-                  d|O|Nz   dIz
  |dtz
  ddd       |O|Ndz  z   }P|j                  ddx       |j                  t(               dy}Q|j                  |Qddx      }R|j                  ||Rz
  dz  |Pdzz   |Q       |j                  d	d
       |j                  tI        d{             d|}S|j                  |Sd	d
      }+|j                  ||+z
  dz  |Pd'z   |S       |r6|j                  dd}       |j                  t(               |j                  |dd}      }T||Tz
  dz  }U|j                  |UPd~z
  |       t!        dI      D ]r  }t#        t        t$        |dz        }V|j                  |V       |j'                  Ud/z
  |dCz  z
  Pd!z
  ddd       |j'                  |UTz   d/z   |dCz  z   |Pd!z
  ddd       t |j                  dd       |j                  tI        d             d}W|j                  |Wdd      }X|j                  ||Xz
  dz  Pd.z
  |W       nX|j                  dd       |j                  t(               d}Y|j                  |Ydd      }Z|j                  ||Zz
  dz  Pd!z
  |Y       te        ||       |j                          |S )a  
    Generate a branded Business AI Score PDF report.

    Args:
        business_name: Name of the business
        scores: Dict from analyzer with category scores
        recommendations: List of recommendation dicts
        output_path: Full path for the output PDF
        phone_cta: Phone number for CTA (optional)
        website_url: The business URL analyzed

    Returns:
        Path to generated PDF
    .T)exist_ok)pagesizeoverallr   r   d   	Helvetica
   r(   zBUSINESS INTELLIGENCE REPORT   333333?         fillstroke   Helvetica-Bold   N0   ... <   n      	   r)   zGenerated: z%d %B %Yr%         (         ?      :      g?z#0D0E127   ,      z/100      zYour Business AI Score   r   z6Significant improvements needed across multiple areas.u?   Below average — key areas need attention to stay competitive.r   u3   Room for improvement — some strengths, some gaps.u:   Good foundation — optimizations will drive more results.u8   Strong position — fine-tuning will maximize your edge.      zScore Breakdown    r/   X   "      6   ;   g      @   p      g?.   _provider_inteldetected_providerest_monthly_costF   z#1A1520      ?!?   R   zCurrent Provider Detected: zEstimated spend: z~$z/mo$   zCWe can match this site + add an AI receptionist for the same price.zSWITCH & SAVEg      @Recommendations   impactmediumMEDIUMHIGHzHIGH IMPACT)r   MODERATEr   z	QUICK WINi      >   E   category_ #titleD   descriptiondetail)	max_linesx   #   *   T      z*Hear What Your AI Receptionist Sounds Like   z#BFDBFEzOFree 2-minute demo call. No obligations. Your AI answers in your business name.      g      ?z#93C5FDu   CALL NOW — FREE DEMOzVisit receptionistai.au)Cosmakedirspathdirnamer   r   Canvasget_draw_page_background_draw_page_decorations_draw_headersetFontsetFillColorACCENT_BLUE
drawStringstringWidthrangerD   BG_COLORcircle
TEXT_WHITElenrectACCENT_PURPLE	TEXT_GRAYTEXT_DIMr   nowstrftimeBG_CARD	roundRectsetStrokeColorDIVIDER_LIGHTsetLineWidthr   r"   r   strr.   BG_CARD_LIGHTmax_draw_section_header
isinstancedictCATEGORY_LABELSCATEGORY_ICONSCATEGORY_COLORSACCENT_ORANGETEXT_LIGHT_GRAYACCENT_ORANGE_DIM_draw_footershowPage	enumerateupperr   r   r   r    r   r!   DIVIDERreplacer   _draw_wrapped_textACCENT_BLUE_FAINTACCENT_BLUE_DIMsave)[rE   rF   rG   rH   rI   rJ   whcoverall_scoreydot_xi	alpha_coldisplay_namescore_card_yscore_card_hcxcy	score_colscore_col_dim
glow_stepsradiusglow_col
score_texttwsubtw2text_xtext_cydescbar_total_wfilled_w
categoriescatcat_data	cat_score	cat_labelcat_iconcoloraccentbadge_w	score_strstwbar_xbar_ybar_wbar_hfill_wtip_colprovider_inteldetectedest_costbox_hbox_yspend_xafter_spend
badge_textbadge_w2badge_xbadge_yrec
impact_rawr   	badge_colbadge_bg
border_colcard_xcard_wcard_hcard_ybadge_text_wcat_namecat_displaynum_textnum_wr   r   cta_hcta_y
cta_center	cta_titlettwcta_subptwphone_x	dot_alpha	call_textctw
visit_textvtws[                                                                                              r   generate_pdfr+  {   sN   . KK,3dCDAqkF3AJJy"-11'1=M !Q"1a#Aq 	
CAIIk2NN;LLQ67 ={BOORTTE1X <Xq3w?		y!	QAqq;< GAII#NN: "%#m2Dr2IrRLLLQ% GANN;FF2q"aaF*NN=!FF32qqF+	R			+q!	y!	RK,- GAIIk1NN8LLQ+hlln&=&=j&I%JKL GAs7LLNN7KKL!b&,1KM ]#NN3KKL!b&,1KM	B	q(	(B]+I$]3M J:q"% 3a!ew	4!8<	x 	Ra2	3 NN8I&'HHRRaH* YNN1HHRRaH* ]#NN3HHRRaH* II#NN:]#J	
z#3R	8BLLb1fb1fj1 IIk2NN9
C
--["
-CLLcAgrBw, F2gGII#NN:LL":;rMGII#NN9LL,}"=>rMGIIk1NN9G	"	P	"	D	"	KILL$' rMGKmc12HNN=!KKa1KENN9KKQ!11aaKJ 	rAAq"34GAhJ 4::c2&0:8T0JHLL!,PQ	#''S1	!%%c2.Y' $$S+6 	
w	BBBAAa@ 	
v--*:A>C	BAwAAa@			"A&	z"	RS(+ 	
		"B'	z"	R'\A%q1ui8 	
		"B'	u	N	mmI'7<	QVc\1q5)4 BC	}%	E5%!D QS12	u	E5&%1E B;!%S9GNN7#KK*EAIq%!)QQWXKY	Ri4n ZZ 126N!!"56H!!"45HH	QE	B 	
x	*+	Bq2vuaaB 	
'	s	Bq2vuaaB 	
}%	Bq%1= 	
		"B'	}%	RQ$ 	
'	s	QUBQq1 	
		"B'	}%	RQ"=hZ HI 	
		+q!	'	RR	"q}}%8+qII			"B'	}%	Wa"f8*C&898*C.@BRTV WW			+q!	'	RRQ	S %
==-=qABFb&8#a%	()	GWhAAaH			"A&	z"	Wq['C-<BJ A JJL!Q"1a#Aq	CAAq"34GAOBQ/0 M3s7 WWXx0
'1*c'B!!#V!I$H&J"J--$I'H#J%J#I&H$J$J RVb 	
w	FFFFAAaH 	
!	s	FFFFAAaH 	
z"	FFAvqqC }}Z1A1EJ	x 	BA|R1E			"A&	y!	RQ
+ 77:r*%))(H4D4DS#4N4T4T4VW			+q!	x 	R,&*AE;? 	
		"A&	x q1ug;h(8!<	Vf_r)E11q5(C 	
		"B'	z"$	RRs, "(=>			+r"	z"1fb!b&&2+rQO	Vb[[M` EE NN$%KKEAIq2vurz2AaKH NN?#KKE1r65"1QK? [!NN1KKE1r65"1QK? NN;FF2uu}q !c'11QF? "JII#NN:<I
--	#3R
8CLL!c'Q
R; IIk2NN8I&'_G
--b
1CLL!c'Q
Q8			"B'	z"mmI'7<s7a-	Wj2oy9 q 	WA#K1t8DINN9%HHWr\AE):?AAaHPHHWs]R'!a%/b!!TUHV		W 	
		"A&	x	*+,	mmI'7;	a#g]JOY?			"B'	z".
mmJ(8"=	a#g]JOZ@ AFFHr   c                 \    | j                  t               | j                  dd||dd       y)zFill page with dark background.r   rW   rX   N)r   r   r   )r   r   r   s      r   r   r   I  s&    NN8FF1aAAaF(r   c           	         t        d      dft        d      dft        d      dfg}|D ]2  \  }}| j                  |       | j                  |dz
  |dz
  |dd	
       4 | j                  t        d             | j                  ddddd	
       | j                  t        d             t        d	t	        |      d      D ]3  }t        d	t	        |      d      D ]  }| j                  ||ddd	
        5 y)z>Add subtle decorative elements to the page for a premium feel.z#0F172Ari   z#0D1320r   z#0B1018r)   r%   rW   r   rX   z#0E0F1Ar[   r(   rP   z#15161Drg   rh   N)r   r   r   r   int)r   r   r   glow_colorscolsizegxgys           r   r   r   O  s     
)	c"	)	c"	)	b!K
 ! 9	T	s	RRAa89
 NN8I&'HHRSqH+ NN8I&'As1vr" 43q62& 	4BHHRSqH3	44r   c           	      t   | j                  t               | j                  d|dz
  |ddd       d}d}||z  }t        |      D ]P  }||dz
  z  }t	        t
        t        |      }| j                  |       | j                  ||z  |dz
  |dz   |dd       R | j                  dd       | j                  t
               | j                  d	|d
z
  d       | j                  ddd      }	| j                  dd       | j                  t               | j                  d	|	z   dz   |d
z
  d       | j                  dd       | j                  t               d}
| j                  |
dd      }| j                  |d	z
  |z
  |dz
  |
       | j                  t
               | j                  |d	z
  |z
  dz
  |dz
  ddd       y)z1Draw top header bar with ReceptionistAI branding.r   A   rW   rX   r%   rS   r   r\   r(   -   ReceptionistAIrQ   r|   rV   z.aurd   z AI-Powered Business Intelligencer   rU   '         @N)r   r   r   r   rD   r   r   r   r   r   r   r   r   )r   r   r   stepsline_h	segment_wr   r@   r0  brand_wtagliner"  s               r   r   r   f  s    NN7FF1a"fa!AF. EFE	I5\ OO+}a8	s	q9}a"fi!mV!AN	O II#NN;LLQV-. mm,.>CGIIk2NN9LLg!1r651 IIk1NN80G
--a
0CLLR#q2vw/ NN;HHQVc\Aq2vs1H=r   c                    | j                  dd       | j                  t               | j                  d||       | j	                  |dd      }|dz
  }| j                  t
               | j                  d||dz  ddd	       | j                  t               | j                  d|dz  z   ||d
z  ddd	       | j                  t               | j                  d|dz  z   ||dz  ddd	       d|z   dz   }t        d      D ]J  }t        t        t        |dz        }| j                  |       | j                  ||dz  z   |dz   ddd	       L y)z7Draw a styled section header with decorative underline.r\   r   r(   rU   rh   r9  rW   r   rX   rT   g?g?rR   rm   ry   r   N)r   r   r   r   r   r   r   r   ACCENT_CYANr   rD   r   r   r   )	r   r   r   r   title_wline_y	dot_startr   dot_cols	            r   r   r     s;   II#NN:LLQmmE#3R8G UFNN;FF2vw}c!F<NN=!FF2#vw}c!FLNN;FF2#vw}c!FL Wr!I1X Gh!c':	w	QU"FQJ!AFGr   c           	         d}||z  }t        |      D ]^  }||dz
  z  }t        t        t        |      }t        t        |d      }| j                  |       | j                  ||z  d|dz   ddd       ` | j                  dd       | j                  t               | j                  d	d
d       | j                  dd       | j                  t               | j                  d	| j                  ddd      z   d
dt        j                         j                  d              | j                  dd       | j                  t        d             d}| j                  |dd      }| j                  |d	z
  |z
  d
|       y)z2Draw footer with branding and decorative elements.r%   rW   rT   r   r   rX   r\   rU   r(   r   zPowered by ReceptionistAIrQ   zPowered by ReceptionistAI  z|  receptionistai.au  |  z%Yry   z#475569zOThis report was generated using publicly available data and automated analysis.N)r   rD   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )	r   r   r:  r<  r   r@   r0  
disclaimerdtws	            r   r   r     sW    EE	I5\ FO+}a8(C-	s	q9}b)a-1EF II"NN9LLR45IIk1NN8LLamm$ACSUVWWY[,X\\^-D-DT-J,KLN IIk1NN8I&'bJ
--
K
3CLLR#r:.r   textxr   	max_width	font_sizer   c                    |sy|j                         }g }d}	|D ]E  }
|	 d|
 j                         }| j                  |d|      |k  r|}	1|	r|j                  |	       |
}	G |	r|j                  |	       t	        |d|       D ]K  \  }}||dz
  k(  r"t        |      |kD  r|dt        |      dz
   dz   }| j                  ||||dz   z  z
  |       M y)zDraw text with word wrapping.Nr`   r   rQ   rW   rS   r_   )splitstripr   appendr   r   r   )r   rH  rI  r   rJ  rK  r   wordslinescurrent_lineword	test_liner   lines                 r   r   r     s    
 JJLEEL  #nAdV,224	==K;yH$L\*L  \"U:I./ 94	A#e*y"8TQ'%/D	QQ)a-01489r   )r`   r`   )rd   rS   )F__doc__mathr   r   typingr   reportlab.lib.pagesizesr   reportlab.lib.unitsr   r   reportlab.lib.colorsr   r	   r
   r   reportlab.pdfgenr   reportlab.lib.enumsr   r   r   reportlab.platypusr   r   reportlab.lib.stylesr   r   r   r   BG_CARD_HOVERr   r   ACCENT_BLUE_GLOWr   r   r   r   r@  r   r   r   r   r   r   r   r    r   r!   r   r   r.  r   r"   r   r.   r   r   r   rD   r   listr+  r   r   r   r   r   floatr   r-   r   r   <module>rd     sg    	   * ( > > # < < / / I
9
##y!9%I& Y' #Y' #y!i 
Y	9%IY	#	"I& y!9%
9
# C   & %,($ !# i(!),	*9%Y' GGG G 	G
 G G 	G\)4.$>NG2/> ,-999$91699%(9r   