§
    éƒtjÇ  ã                  óÊ   — d Z ddlmZ ddlZddlZddlmZ ddlmZm	Z	  ej
        d¦  «        Z ej
        d¦  «        Zd d„Zd d„Zddœd!d„Zd"d„Zd#d„ZdZddœd$d„Zd%d„ZdS )&z>Turn structured statement facts into natural-language answers.é    )ÚannotationsN)ÚAny)ÚInsightTransactionÚStructuredInsightz¢(?i)\b(in\s+a\s+paragraph|as\s+a\s+paragraph|paragraph\s+form|as\s+prose|in\s+prose|in\s+words|write\s+it\s+out|narrative|describe\s+in\s+words|full\s+sentence)\bzÖ(?i)\b(explain\s+naturally|natural\s+language|tell\s+me\s+in\s+words|summarize\s+in\s+words|write\s+a\s+summary|plain\s+english|analy[sz]e|overview|summar(?:y|ize)|what\s+do\s+you\s+think|insights?|observations?)\bÚquestionÚstrÚreturnÚboolc                óT   — t          t                               | pd¦  «        ¦  «        S ©NÚ )r
   Ú_PARAGRAPH_REÚsearch©r   s    ú1/var/www/html/CA-Chatbot/app/saas/answer_style.pyÚwants_paragraph_formatr      s"   € Ý•×$Ò$ X ^°Ñ4Ô4Ñ5Ô5Ð5ó    c                óT   — t          t                               | pd¦  «        ¦  «        S r   )r
   Ú	_PROSE_REr   r   s    r   Úwants_prose_answerr   !   s"   € Ý•	× Ò   ¨RÑ0Ô0Ñ1Ô1Ð1r   ©ÚintroÚtransactionsúlist[InsightTransaction]r   ú
str | Nonec          	     óú  — | s|pdS g }| D ]~}|j         pd                     ¦   «         }|j        pd                     ¦   «         }|j        r$|                     d|j        › d|› d|› �¦  «         Œc|                     d|› d|› �¦  «         Œd                     |¦  «        }|r?|d	                              ¦   «         s%|d	                              ¦   «         |d
d …         z   }|pdt          | ¦  «        › d�}|› d|› d�S )Nz8I could not find any payments to list on this statement.ÚPaymentr   zon z
 you paid z to z	you paid z; r   é   zHere are all z payments on your statement:Ú ú.)	ÚdescriptionÚstripÚamountÚdateÚappendÚjoinÚisupperÚupperÚlen)r   r   ÚpartsÚtÚdescÚamtÚbodyÚprefixs           r   Útransactions_to_paragraphr0   %   s=  € ð
 ð SØÐRÐRÐRØ€EØð 6ð 6ˆØ”Ð* ×1Ò1Ñ3Ô3ˆØŒxˆ~˜2×$Ò$Ñ&Ô&ˆØŒ6ð 	6Ø�LŠLÐ@˜qœvÐ@Ð@°Ð@Ð@¸$Ð@Ð@ÑAÔAÐAÐAà�LŠLÐ4 SÐ4Ð4¨dÐ4Ð4Ñ5Ô5Ð5Ð5Ø�9Š9�UÑÔ€DØð *�D˜”G—O’OÑ%Ô%ð *Ø�AŒw�}Š}‰Œ  a b b¤Ñ)ˆØÐUÐU¥c¨,Ñ&7Ô&7ÐUÐUÐU€FØÐÐ�tÐÐÐÐr   Úinsightr   c           	     ó&  — t          | j        pg ¦  «        }|s| S t          || j        r| j                             d¦  «        dz   nd¬¦  «        }|                      |g t          | j        pg ¦  «        dt          |¦  «        › d�gz   dœ¬¦  «        S )	z7Replace card-style transaction list with flowing prose.r    ú:Nr   zListed all z) payments in paragraph form as requested.)Úsummaryr   Ú	footnotes)Úupdate)Úlistr   r0   r4   ÚrstripÚ
model_copyr5   r)   )r1   r   ÚtxnsÚproses       r   Úapply_paragraph_styler<   ;   s¸   € å�Ô$Ð*¨Ñ+Ô+€DØð ØˆÝ% dÐW^ÔWfÐ2p°'´/×2HÒ2HÈÑ2MÔ2MÐPSÑ2SÐ2SÐlpÐqÑqÔq€EØ×ÒàØÝ˜gÔ/Ð5°2Ñ6Ô6ØQ�S ™YœYÐQÐQÐQÐRñSð
ð 
ð ñ ô ð r   údict[str, Any]c                óÌ   — | j         | j        d„ | j        pg D ¦   «         t          | j        pg ¦  «        d„ | j        pg d d…         D ¦   «         t          | j        pg ¦  «        dœS )Nc                ó,   — g | ]}|j         |j        d œ‘ŒS )©ÚlabelÚvaluer@   )Ú.0Úms     r   ú
<listcomp>z)insight_facts_payload.<locals>.<listcomp>O   s$   € ÐZÐZÐZ¸Q˜aœg°´Ð8Ð8ÐZÐZÐZr   c                óD   — g | ]}|j         |j        |j        |j        d œ‘ŒS )©r$   r!   r#   Ú	directionrG   )rC   r+   s     r   rE   z)insight_facts_payload.<locals>.<listcomp>Q   sE   € ð 
ð 
ð 
ð ð œØ œ}Øœ(Øœ[ð	ð ð
ð 
ð 
r   éP   )Úheadliner4   ÚmetricsÚ
highlightsÚpaymentsr5   )rJ   r4   rK   r7   rL   r   r5   )r1   s    r   Úinsight_facts_payloadrN   K   sŒ   € àÔ$Ø”?ØZÐZÀ7Ä?ÐCXÐVXÐZÑZÔZÝ˜7Ô-Ð3°Ñ4Ô4ð
ð 
ð Ô*Ð0¨b°#°2°#Ô6ð
ñ 
ô 
õ ˜'Ô+Ð1¨rÑ2Ô2ðð ð r   u©  You are Alex, a friendly financial assistant. Rewrite the answer using ONLY the facts below.

Rules:
- Lead with a direct answer to the user's question in the first sentence.
- Then add 1â€“3 short supporting observations (patterns, largest items, what stands out).
- Do NOT restate every metric from the facts list â€” the UI already shows those in cards.
- Do not invent numbers, dates, merchants, or payments.
- Keep currency amounts exactly as shown when you do mention a figure.
- Friendly, concise, conversational. No filler. No greetings or goodbyes.
- Never mention RAG, chunks, vectors, extraction, or embeddings.

User question: {question}

Facts (JSON):
{facts}

Answer:é   )Úmax_payments_in_promptrP   Úintc          
     ór  — t          | ¦  «        }|                     d¦  «        pg }t          |¦  «        |k    rdS 	  |t                               |pd                     ¦   «         t          j        |dd¬¦  «        ¬¦  «        d¬	¦  «        }n# t          $ r Y dS w xY w|pd                     ¦   «         }|pdS )
uH   Optional LLM pass â€” grounds prose in structured facts, not raw chunks.rM   Nr   Fé   )Úensure_asciiÚindent)r   ÚfactséÜ   )Únum_predict)	rN   Úgetr)   ÚPOLISH_PROMPTÚformatr"   ÚjsonÚdumpsÚ	Exception)r1   r   Úinvoke_ollamarP   rV   rM   ÚrawÚtexts           r   Úpolish_insight_with_llmrb   q   sâ   € õ " 'Ñ*Ô*€EØ�yŠy˜Ñ$Ô$Ð*¨€HÝ
ˆ8�}„}Ð-Ò-Ð-àˆtð	ØˆmÝ× Ò Ø"˜. b×/Ò/Ñ1Ô1Ý”j °UÀ1ÐEÑEÔEð !ñ ô ð ð
ñ 
ô 
ˆˆøõ ð ð ð ØˆtˆtðøøøàˆI�2×ÒÑÔ€DØˆ<�4Ðs   ½AB Â
BÂBc                óÎ  — | j         r| j                              ¦   «         gng }| j        rŽt          | j        ¦  «        }|                     d¦  «         |                     |dk    rd|› d�nd¦  «         | j        D ]<}|j        r
|j        › d�nd}|                     d|› |j        › d|j        › �¦  «         Œ=d	                     |¦  «                             ¦   «         p| j	        S )
uH   Copy/audit text: narrative summary first â€” cards already show metrics.r   é   z
Payments (ú)ÚPaymentsu    Â· z- u    â€” Ú
)
r4   r"   r   r)   r%   r$   r!   r#   r&   rJ   )r1   r*   Únr+   Úwhens        r   Úchat_text_from_insightrj   Œ   sþ   € à)0¬Ð@ˆWŒ_×"Ò"Ñ$Ô$Ð%Ð%¸b€EØÔð DÝ�Ô$Ñ%Ô%ˆØ�Š�RÑÔÐØ�Š¨!¨aª%¨%Ð& !Ð&Ð&Ð&Ð&°ZÑ@Ô@Ð@ØÔ%ð 	Dð 	DˆAØ&'¤fÐ4�a”f�?�?�?�?°"ˆDØ�LŠLÐB˜dÐB A¤MÐBÐB¸¼ÐBÐBÑCÔCÐCÐCØ�9Š9�UÑÔ×!Ò!Ñ#Ô#Ð7 wÔ'7Ð7r   )r   r   r	   r
   )r   r   r   r   r	   r   )r1   r   r   r   r	   r   )r1   r   r	   r=   )r1   r   r   r   rP   rQ   r	   r   )r1   r   r	   r   )Ú__doc__Ú
__future__r   r\   ÚreÚtypingr   Úapp.models.schemasr   r   Úcompiler   r   r   r   r0   r<   rN   rZ   rb   rj   © r   r   ú<module>rr      sF  ðØ DÐ Dà "Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø Ð Ð Ð Ð Ð à DÐ DÐ DÐ DÐ DÐ DÐ DÐ Dà�”
ðñô €ð ˆBŒJðñô €	ð6ð 6ð 6ð 6ð2ð 2ð 2ð 2ð ðð ð ð ð ð ð,ð ð ð ð ð ð ð ð&€ð0 #%ðð ð ð ð ð ð6
8ð 
8ð 
8ð 
8ð 
8ð 
8r   