Ë
    esjÂ  ã            	       óÔ   — d Z ddlZddlZddlZddlZddlmZmZmZ ddl	m
Z
 ddlmZ ddlmZ  ej                  e«      ZdZdZdad	„ Zd
efd„Zdeded
efd„Zddœdededed
efd„Zy)aô  Render the email body as a generated image, hosted for mail clients to fetch.

HTML generation gave inconsistent layouts between sends. An image is visually
consistent and gets real iconography, at the cost of clickable links and text --
so the caller keeps the header, links and footer as HTML around it, and every
email still carries a plain-text part.

Images are uploaded to a public blob container because mail clients cannot render
base64 data URIs: Gmail strips them and Outlook ignores them.
é    N)ÚBlobServiceClientÚContentSettingsÚPublicAccess)ÚAzureOpenAI)Úsettings)ÚEMAIL_BODY_IMAGE_PROMPTzemail-assetsÚ	1024x1536c                  óÌ   — t         €Yt        j                  rt        j                  syt	        t        j                  t        j
                  t        j                  ¬«      a t         S )zGThe image model lives on a separate Azure resource from the chat model.N)Úapi_keyÚapi_versionÚazure_endpoint)Ú_image_clientr   ÚAZURE_OPENAI_ENDPOINT_IMAGEÚAZURE_OPENAI_API_KEY_IMAGEr   ÚAZURE_OPENAI_API_VERSION_IMAGE© ó    ú7/var/www/html/strategist-ai/app/services/email_image.pyÚ_clientr      sK   € ô ÐÜ×4Ò4¼×9\Ò9\ØÜ#Ü×7Ñ7Ü ×?Ñ?Ü#×?Ñ?ô
ˆô
 Ðr   Úreturnc                  óL   — t        t        j                  xr
 t        «       «      S )N)Úboolr   ÚEMAIL_BODY_IMAGEr   r   r   r   Úimage_generation_availabler   ,   s   € Ü”×)Ñ)Ò7¬g«iÓ8Ð8r   Ú	tenant_idÚ	png_bytesc                 ó„  — 	 t        j                  t        j                  «      }|j	                  t
        d¬«      j                  }|j                  |«      j                  «       s!|j                  |t        j                  ¬«       t        j                  |«      j                  «       dd }d| › dt        t!        j                   «       «      › d|› d	�}|j	                  t
        |¬«      }|j#                  |d
t%        d¬«      ¬«       |j&                  S # t(        $ r"}t*        j-                  d|› �«       Y d}~yd}~ww xY w)z@Upload and return a public URL, or '' if hosting is unavailable.Úx)Ú	containerÚblob)Úpublic_accessNé   zbody/ú/Ú-z.pngTz	image/png)Úcontent_type)Ú	overwriteÚcontent_settingsz!Could not host email body image: Ú )r   Úfrom_connection_stringr   ÚAZURE_STORAGE_CONNECTION_STRINGÚget_blob_clientÚ	CONTAINERÚcontainer_nameÚget_container_clientÚexistsÚcreate_containerr   ÚBLOBÚhashlibÚsha1Ú	hexdigestÚintÚtimeÚupload_blobr   ÚurlÚ	ExceptionÚloggerÚerror)r   r   Úservicer   ÚdigestÚpathr    Úexs           r   Ú_uploadr@   0   s  € ðÜ#×:Ñ:¼8×;cÑ;cÓdˆØ×+Ñ+´iÀcÐ+ÓJ×YÑYˆ	Ø×+Ñ+¨IÓ6×=Ñ=Ô?Ø×$Ñ$ Y¼l×>OÑ>OÐ$ÔPä—‘˜iÓ(×2Ñ2Ó4°S°bÐ9ˆØ�y�k ¤3¤t§y¡y£{Ó#3Ð"4°A°f°X¸TÐBˆØ×&Ñ&´ÀÐ&ÓFˆØ×Ñ˜¨dÜ*9À{Ô*Sð 	ô 	Uà�x‰xˆøÜò Ü�‰Ð8¸¸Ð=Ô>Üûðús   ‚DD Ä	D?ÄD:Ä:D?)r   ÚsubjectÚ	body_textc                 óx  — t        «       }|si S t        j                  | j                  | j                  xs d| j
                  xs d||¬«      }t        j                  «       }	 |j                  j                  t        j                  |dt        ¬«      }t        j                  |j                  d   j                  «      }t'        |xs d	|«      }
|
si S t"        j)                  d
t        j                  «       |z
  d›d|
› �«       |
dddœS # t         $ r$}	t"        j%                  d|	› �«       i cY d}	~	S d}	~	ww xY w)zAGenerate the body panel as an image. Returns {} when unavailable.z#4B4B8Fz#222222)Ú
brand_nameÚprimary_colorÚaccent_colorrA   rB   é   )ÚmodelÚpromptÚnÚsizer   z$Email body image generation failed: NÚsharedzGenerated email body image in z.1fzs -> i   i   )r8   ÚwidthÚheight)r   r   ÚformatÚnamerE   rF   r6   ÚimagesÚgenerater   ÚAZURE_OPENAI_DEPLOYMENT_IMAGEÚ
IMAGE_SIZEÚbase64Ú	b64decodeÚdataÚb64_jsonr9   r:   r;   r@   Úinfo)ÚbrandrA   rB   r   ÚclientrI   ÚstartedÚresultÚpngr?   r8   s              r   Úgenerate_body_imager_   C   s"  € ä‹Y€FÙØˆ	ä$×+Ñ+Ø—:‘:Ø×)Ñ)Ò6¨YØ×'Ñ'Ò4¨9ØØô€Fô �i‰i‹k€GðØ—‘×'Ñ'Ü×8Ñ8Ø˜Q¤Zð (ó 
ˆô ×Ñ˜vŸ{™{¨1™~×6Ñ6Ó7ˆô
 �)Ò'˜x¨Ó
-€CÙØˆ	Ü
‡K�KÐ0´·±³¸wÑ1FÀsÐ0KÈ5ÐQTÐPUÐVÔWØ °Ñ6Ð6øô ò Ü�‰Ð;¸B¸4Ð@ÔAØ�	ûðús   Á$AD Ä	D9ÄD4Ä.D9Ä4D9)Ú__doc__rU   r2   Úloggingr6   Úazure.storage.blobr   r   r   Úopenair   Úapp.core.configr   Úapp.core.promptsr   Ú	getLoggerÚ__name__r:   r,   rT   r   r   r   r   ÚstrÚbytesr@   Údictr_   r   r   r   ú<module>rk      sœ   ðñ	ó Û Û Û ç OÑ OÝ å $Ý 4à	ˆ×	Ñ	˜8Ó	$€à€	Ø€
à€òð9 Dó 9ð�sð  uð °ó ð& RVò 7¨3ð 7¸3ð 7È3ð 7ÐZ^ô 7r   