Ë
    §‘ˆj�  ã                   ó¬   — d Z ddlZddlZddlmZ ddlmZ  ej                  e«      Z	dZ
h d£Zdefd„Zd	ed
efd„Zd	ed
efd„Zd	ed
efd„Zded
efd„Zy)aD  Read a tenant's BrandForge analysis and reduce it to what an email needs.

BrandForge already crawls each tenant's site and extracts their real brand:
name, colour palette with roles, fonts, logos and page links. That is a far
better source for branding an email than the Organisation signup record, where
the trading name is often a placeholder.

The raw analysis is large and noisy, so this module picks only what a designer
would actually use, and applies email-specific rules the analysis does not know
about (SVG logos do not render in Gmail or Outlook; webp is unreliable).
é    N)Úsql)Úget_db_connection)z.pngz.jpgz.jpegz.gif>   ú#000ú#fffú#000000ú#ffffffÚ	tenant_idc                 ó  — t        «       }	 |j                  «       5 }|j                  d| f«       |j                  «       d   s	 d d d «       |j	                  «        y |j                  t        j                  d«      j                  t        j                  | «      «      «       |j                  «       }|r|d   s	 d d d «       |j	                  «        y |d   }t        |t        «      rt        j                  |«      n|cd d d «       |j	                  «        S # 1 sw Y   nxY wnA# t        $ r5}t        j                  d| › d|› �«       Y d }~|j	                  «        y d }~ww xY w	 |j	                  «        y # |j	                  «        w xY w)NztSELECT EXISTS (SELECT FROM information_schema.tables WHERE table_schema = %s AND table_name = 'brandforge_analyses')r   zOSELECT full_result FROM {}.brandforge_analyses ORDER BY created_at DESC LIMIT 1z'Could not read BrandForge analysis for z: )r   ÚcursorÚexecuteÚfetchoneÚcloser   ÚSQLÚformatÚ
IdentifierÚ
isinstanceÚstrÚjsonÚloadsÚ	ExceptionÚloggerÚerror)r	   ÚconnÚcurÚrowÚresultÚexs         úC/var/www/html/strategist-ai/app/services/integrations/brandforge.pyÚ_load_analysisr      sW  € ÜÓ€DðØ�[‰[‹]ð 	M˜cØ�K‰KðRà�ôð
 —<‘<“> !Ò$Ø÷	Mð* 	�
‰
�ð �K‰KÜ—‘ð ;ó <ß<B¹FÄ3Ç>Á>ÐR[ÓC\Ó<]ôð —,‘,“.ˆCÙ˜c !šfØ÷	Mð* 	�
‰
�ð ˜‘VˆFÜ)3°F¼CÔ)@”4—:‘:˜fÔ%Àf÷!	Mð 	Mð* 	�
‰
�÷+	Mð 	Múð 	Møô" ò Ü�‰Ð>¸y¸kÈÈBÈ4ÐPÔQÛà�
‰
�ûð	úð#	Mð* 	�
‰
�øˆ�
‰
�ús_   ŒD& œ(DÁD& ÁADÂ;D& Ã+DÃ?	D& ÄD"ÄD& Ä%E9 Ä&	E$Ä/EÅ
E9 ÅE$Å$E9 Å9FÚanalysisÚreturnc                 óì  ‡— | j                  d«      xs i j                  d«      xs g }|D �cg c]>  }|j                  d«      xs dj                  «       t        vr|j                  d«      r|‘Œ@ }}|j                  d„ d¬«       t	        d„ |D «       d	«      Št	        ˆfd
„|D «       d	«      }‰s
|r|d   d   Š|st	        ˆfd„|D «       d	«      }‰||d	d D �cg c]  }|d   ‘Œ	 c}dœS c c}w c c}w )zIPrimary and accent colours, skipping black/white which carry no identity.ÚcolorsÚpaletteÚhexÚ c                 óX   — | j                  d«      xs d| j                  d«      xs dz  S )NÚ
confidencer   Úscoreé   ©Úget)Úcs    r   ú<lambda>z_pick_colors.<locals>.<lambda>=   s&   €  §¡ lÓ 3Ò 8°q¸Q¿U¹UÀ7»^Ò=PÈqÑQ€ ó    T)ÚkeyÚreversec              3   óP   K  — | ]  }|j                  d «      dk(  sŒ|d   –— Œ  y­w)ÚroleÚprimaryr%   Nr+   )Ú.0r-   s     r   ú	<genexpr>z_pick_colors.<locals>.<genexpr>?   s#   è ø€ ÒL °·±°v³À)Ó1K�A�e•HÑLùs   ‚&œ
&Nc              3   ób   •K  — | ]&  }|j                  d «      dk(  sŒ|d   ‰k7  r|d   –— Œ( y­w)r3   Úaccentr%   Nr+   ©r5   r-   r4   s     €r   r6   z_pick_colors.<locals>.<genexpr>@   s7   øè ø€ ò , °·±°f³ÀÓ0IØ˜‘x 7Ò*ð �U•8ñ ,ùs   ƒ/�/r   c              3   ó:   •K  — | ]  }|d    ‰k7  sŒ|d    –— Œ y­w)r%   N© r9   s     €r   r6   z_pick_colors.<locals>.<genexpr>E   s    øè ø€ ÒH A°A°e±HÀÓ4G�q˜•xÑHùs   ƒ‘
é   )r4   r8   Úall)r,   ÚlowerÚ_NEUTRALÚsortÚnext)r    r$   r-   Úbrandedr8   r4   s        @r   Ú_pick_colorsrC   8   s  ø€ à—‘˜XÓ&Ò,¨"×1Ñ1°)Ó<ÒCÀ€GØ!ö Q�QØ—5‘5˜“<Ò% 2×,Ñ,Ó.´hÑ>À1Ç5Á5ÈÄ<ò ð Q€Gð Qà‡L�LÑQÐ[_€LÔ`äÑL gÔLÈdÓS€GÜó , Wô ,Ø-1ó3€Fá‘wØ˜!‘*˜UÑ#ˆÙÜÓH¨ÔHÈ$ÓOˆØ¨&Ø&-¨b¨q kÖ2 �A�e“HÒ2ñ4ð 4ùòQùò 3s   ®AC,ÃC1c                 ó6  — | j                  d«      xs i }g }|j                  d«      xs g D ];  }|j                  d«      sŒ|j                  |j                  d«      du |d   f«       Œ= |j                  d«      xs g |j                  d«      xs g z   D ]  }|j                  d|f«       Œ |j                  d	«      xs g D ]  }|j                  d|f«       Œ d
D ]:  }|D ]3  \  }}||u sŒ|j                  «       j                  t        «      sŒ/|c c S  Œ< y)zGAn email-renderable logo, preferring a real header logo over a favicon.ÚassetsÚlogo_candidatesÚurlÚ	is_headerTÚhomepage_logo_imagesÚlogo_imagesFÚfavicons)TFr&   )r,   Úappendr>   ÚendswithÚEMAIL_SAFE_IMAGE)r    rE   Ú
candidatesr-   rG   Úheader_firstrH   s          r   Ú
_pick_logorQ   J   s)  € à�\‰\˜(Ó#Ò) r€FØ€JØ�Z‰ZÐ)Ó*Ò0¨bò FˆØ�5‰5��<Ø×Ñ˜qŸu™u [Ó1°TÐ9¸1¸U¹8ÐDÕEðFð —
‘
Ð1Ó2Ò8°b¸V¿Z¹ZÈÓ=VÒ=\ÐZ\Ñ]ò (ˆØ×Ñ˜5 #˜,Õ'ð(à�z‰z˜*Ó%Ò+¨ò (ˆØ×Ñ˜5 #˜,Õ'ð(ð &ò ˆØ(ò 	‰NˆI�sØ˜LÒ(¨S¯Y©Y«[×-AÑ-AÔBRÕ-SØ”
ñ	ðð r/   c                 ó.  — | j                  d«      xs g D �cg c]%  }|j                  d«      sŒ|j                  d«      ‘Œ' }}|D �cg c]  }|sŒ|j                  d«      rŒ|‘Œ c}d d }dj                  d„ |D «       «      |rdz   S dz   S c c}w c c}w )	NÚfontsÚfamilyÚ-é   z, c              3   ó(   K  — | ]
  }d |› d �–— Œ y­w)ú'Nr;   )r5   Úfs     r   r6   z_pick_fonts.<locals>.<genexpr>b   s   è ø€ Ò, !�q˜˜˜1”XÑ,ùs   ‚z, Arial, sans-serifzArial, sans-serif)r,   Ú
startswithÚjoin)r    rY   ÚfamiliesÚsafes       r   Ú_pick_fontsr^   ^   s‰   € Ø*2¯,©,°wÓ*?Ò*EÀ2ÖZ AÈ!Ï%É%ÐPXÍ/�—‘�h•ÐZ€HÐZàÖ?�!¢1¨Q¯\©\¸#Õ->ŠAÒ?ÀÀÐC€DØ�9‰9Ñ, tÔ,Ó,ÉÐ0EÑgÐgÐSfÑgÐgùò [ùâ?s   ˜B¯BÁBÁBÁ"Bc                 ó¶  — | si S t        | «      }|si S |j                  d«      xs i }|j                  d«      xs i }t        |«      }t        «       g }}|j                  d«      xs g D ])  }||vsŒ|j	                  |«       |j                  |«       Œ+ |j                  d«      xs |j                  d«      xs dj                  «       |j                  d«      xs dj                  «       |d   |d	   |d
   t        |«      t        |«      ||j                  d«      xs g D �cg c]'  }|j                  «       j                  t        «      r|‘Œ) c}dœ	S c c}w )zBEmail-relevant brand facts, or {} when the tenant has no analysis.rE   ÚbrandÚlinksÚ
brand_nameÚnamer&   Úsummaryr4   r8   r=   Úhomepage_hero_images)	rc   rd   Úprimary_colorÚaccent_colorr$   Ú
font_stackÚlogo_urlra   Úhero_images)r   r,   rC   ÚsetÚaddrL   Ústripr^   rQ   r>   rM   rN   )	r	   r    rE   r`   r#   Úseenra   rG   Úus	            r   Úbrandforge_profilerp   e   sM  € áØˆ	Ü˜iÓ(€HÙØˆ	à�\‰\˜(Ó#Ò) r€FØ�L‰L˜Ó!Ò' R€EÜ˜(Ó#€Fô “%˜ˆ%€DØ�z‰z˜'Ó"Ò( bò ˆØ�dŠ?Ø�H‰H�SŒMØ�L‰L˜Õðð —‘˜LÓ)ÒD¨U¯Y©Y°vÓ->ÒDÀ"×KÑKÓMØ—I‘I˜iÓ(Ò.¨B×5Ñ5Ó7Ø 	Ñ*Ø˜xÑ(Ø˜%‘=Ü! (Ó+Ü˜xÓ(ØØ$*§J¡JÐ/EÓ$FÒ$LÈ"ö A˜aØŸ7™7›9×-Ñ-Ô.>Ô?ò ò Añð ùòAs   Ä%,E)Ú__doc__r   ÚloggingÚpsycopg2r   Úapp.services.infra.databaser   Ú	getLoggerÚ__name__r   rN   r?   r   r   ÚdictrC   rQ   r^   rp   r;   r/   r   ú<module>rx      s”   ðñ
ó Û å å 9à	ˆ×	Ñ	˜8Ó	$€ð 5Ð ò 2€ð˜có ð64˜4ð 4 Dó 4ð$˜ð  #ó ð(h˜$ð h 3ó hð #ð ¨$ô r/   