Ë
    cœiQ$  ã                   óf   — d dl m Z  d dlmZmZmZ d dlmZ d dlmZ d dl	Z	 G d„ d«      Z
 e
«       Zy)é    )Údatetime)ÚListÚDictÚAny)ÚAsyncIOMotorClient)ÚsettingsNc                   ó®   — e Zd Zd„ Zed„ «       Zddededededed	efd
„Zddeded	ede	e
eef      fd„Zdded	ede
eef   fd„Zddedede
eef   fd„Zy)ÚChatHistoryServicec                 ó.   — d | _         d | _        d | _        y ©N)Ú_clientÚ_dbÚ_collection)Úselfs    úO/var/www/html/Whatsapp_Customer_Support_Chatbot/src/services/history_service.pyÚ__init__zChatHistoryService.__init__   s   € ØˆŒØˆŒØˆÕó    c                 óü   — | j                   €et        t        j                  «      | _        | j                  t        j
                     | _        t        t        dd«      }| j                  |   | _         | j                   S )NÚHISTORY_COLLECTIONÚ
user_chats)r   r   r   ÚMONGODB_URIr   ÚDB_NAMEr   Úgetattr)r   Úcol_names     r   Ú
collectionzChatHistoryService.collection   sb   € à×ÑÐ#ä-¬h×.BÑ.BÓCˆDŒLØ—|‘|¤H×$4Ñ$4Ñ5ˆDŒHäœxÐ)=¸|ÓLˆHØ#Ÿx™x¨Ñ1ˆDÔØ×ÑÐr   NÚuser_identifierÚroleÚmessageÚ	full_nameÚphone_numberÚsourcec              ƒ   ó$  K  — ddl m} ||t        j                  «       dœ}|dk(  r|ddœ}	|ddœ}
|r ||
d<   n	  ||«      }|ddœ}	|ddœ}
|r||
d<   d	|i|
d
œ}| j                  j                  |	|d¬«      ƒ d{  –—†  y#   |«       }Y ŒJxY w7 Œ­w)zö
        Adds a message to the user's chat history with root-level metadata.
        For WhatsApp: user_identifier is ignored, phone_number is used
        For Website: user_identifier is the user_id from frontend (converted to ObjectId)
        r   ©ÚObjectId)r   ÚpartsÚ	timestampÚwhatsapp©Ú
contact_idr!   r   Úwebsite©Úuser_idr!   Úchat_history)z$pushz$setT)ÚupsertN)Úbsonr$   r   Úutcnowr   Ú
update_one)r   r   r   r   r   r    r!   r$   Ú
chat_entryÚqueryÚset_docÚuser_id_objÚ
update_docs                r   Úadd_messagezChatHistoryService.add_message   sÜ   è ø€ õ 	"ð ØÜ!Ÿ™Ó*ñ
ˆ
ð �ZÒà#/¸:ÑFˆEà*Ø$ñˆGñ °˜' +Ò.ð)Ù& Ó7�ð
 !,°yÑAˆEà&Ø#ñˆGñ °˜' +Ñ.ð % jÐ1Øñ
ˆ
ð
 �o‰o×(Ñ(ØØØð )ó 
÷ 	
ñ 	
øð!)á&›j’úð	
ús(   ‚6B¹B  Á9BÁ:BÁ;BÂ 	BÂ	BÚlimitÚreturnc              ƒ   ó  K  — ddl m} |dk(  r|ddœ}nª|dk(  rb|j                  «       rCt        |«      dk\  r5| j                  j                  |ddœ«      ƒ d{  –—† }|rd|v r	|d   | d S 	  ||«      }|dd	œ}nC| j                  j                  |ddœ«      ƒ d{  –—† }|rd|v r	|d   | d S 	  ||«      }|dd	œ}| j                  j                  |«      ƒ d{  –—† }|rd|vrg S |d   | d }|S 7 Œ›#  g cY S xY w7 Œb#  g cY S xY w7 Œ-­w)
z¬
        Retrieves the last N messages.
        For WhatsApp: user_identifier is contact_id
        For Website: user_identifier is user_id (converted to ObjectId)
        r   r#   r'   r(   r*   é
   Nr-   r+   )r/   r$   ÚisdigitÚlenr   Úfind_one)	r   r   r8   r!   r$   r3   Údocr5   Úhistorys	            r   Úget_recent_historyz%ChatHistoryService.get_recent_historyJ   sR  è ø€ õ 	"ð �ZÒØ#2¸jÑI‰EØ�yÒ à×&Ñ&Ô(¬S°Ó-AÀRÒ-Gà ŸO™O×4Ñ4ÀOÐ_iÑ5jÓk×k�Ù˜>¨SÑ0Ø˜~Ñ.°¨v¨wÐ7Ð7ðÙ& Ó7�Ø$/¸9ÑE‘ð
 Ÿ™×0Ñ0ÀÐ[eÑ1fÓg×gˆCÙ�~¨Ñ,Ø˜>Ñ*¨E¨6¨7Ð3Ð3ðÙ& Ó7�Ø$/¸9ÑE�ð —O‘O×,Ñ,¨UÓ3×3ˆÙ�n¨CÑ/ØˆIð �nÑ% u f gÐ.ˆØˆð7 lùðØ’	úð hùðØ’	úà3úsZ   ‚ADÁC4ÁDÁ-C6 Á:"DÂC?ÂDÂ1D Â>DÃD
ÃDÃ6C<Ã:DÄDÄDc              ƒ   óœ  K  — ddl m} d}|dk(  r)|ddœ}| j                  j                  |«      ƒ d{  –—† }nÖ|dk(  rx|j	                  «       r4t        |«      dk\  r&| j                  j                  |ddœ«      ƒ d{  –—† }|s‹	  ||«      }|ddœ}| j                  j                  |«      ƒ d{  –—† }nY| j                  j                  |ddœ«      ƒ d{  –—† }|s1	  ||«      }|ddœ}| j                  j                  |«      ƒ d{  –—† }|s|dk7  r|nd|dk(  r|nd|g dd	œS |j                  d
«      rt        |j                  d
«      «      nd|j                  d«      |j                  d«      |j                  d«      |j                  dg «      t        |j                  dg «      «      dœS 7 �Œ~7 �Œ77 �Œ#  Y Œ¯xY w7 Œé7 Œ¸#  Y ŒºxY w­w)zÐ
        Retrieves complete chat history for a user (for frontend display).
        For WhatsApp: user_identifier is contact_id
        For Website: user_identifier is user_id (converted to ObjectId)
        r   r#   Nr'   r(   r*   r;   r+   )r,   r)   r!   r-   Útotal_messagesr,   r)   r!   r   r-   )r,   r)   r!   r   r-   rC   )r/   r$   r   r>   r<   r=   ÚgetÚstr)r   r   r!   r$   r?   r3   r5   s          r   Úget_full_historyz#ChatHistoryService.get_full_historyv   sÒ  è ø€ õ 	"àˆð �ZÒØ#2¸jÑIˆEØŸ™×0Ñ0°Ó7×7‰CØ�yÒ à×&Ñ&Ô(¬S°Ó-AÀRÒ-Gà ŸO™O×4Ñ4ÀOÐ_iÑ5jÓk×k�ñ ðÙ"*¨?Ó";�KØ(3¸yÑI�EØ $§¡× 8Ñ 8¸Ó ?×?‘Cð
 Ÿ™×0Ñ0ÀÐ[eÑ1fÓg×gˆCÙðÙ"*¨?Ó";�KØ(3¸yÑI�EØ $§¡× 8Ñ 8¸Ó ?×?�Cñ à.4¸
Ò.B™?ÈØ17¸:Ò1E™oÈ4Ø Ø "Ø"#ñð ð 36·'±'¸)Ô2D”s˜3Ÿ7™7 9Ó-Ô.È$ØŸ'™' ,Ó/Ø—g‘g˜hÓ'ØŸ™ Ó-ØŸG™G N°BÓ7Ü! #§'¡'¨.¸"Ó"=Ó>ñ
ð 	
ðG 8ùð
 lùð @úðÙúð høð
 @ùðÙüsƒ   ‚1G³F1´A	GÁ=F4Á>GÂ+F: Â0F7Â1F: Â5"GÃGÃGÃ+G Ä
GÄG ÄB#GÆ4GÆ7F: Æ:F>Æ<GÇG ÇG	ÇGÚpagec              ƒ   ól  ‡
K  — ddl mŠ
 |dz
  |z  }| j                  j                  i «      ƒ d{  –—† }d|id|iddd	d
ddœiddddœig}| j                  j	                  |«      }|j                  |¬«      ƒ d{  –—† }ˆ
fd„}|D �	cg c]
  }	 ||	«      ‘Œ }}	|||||z   dz
  |z  |dœS 7 Œz7 Œ1c c}	w ­w)z¬
        Get all chat histories with user details from admins collection.
        Uses MongoDB $lookup to join user_chats with admins.
        Supports pagination.
        r   r#   é   Nz$skipz$limitz$lookupÚadminsr,   Ú_idÚuser_details)ÚfromÚ
localFieldÚforeignFieldÚasz$unwindz$user_detailsT)ÚpathÚpreserveNullAndEmptyArrays)Úlengthc                 óB  •— d| v rt        | d   «      | d<   d| v r t        | d   ‰«      rt        | d   «      | d<   d| v r9| d   D ]1  }d|v sŒt        |d   t        «      sŒ|d   j                  «       |d<   Œ3 d| v r#| d   rd| d   v rt        | d   d   «      | d   d<   | S )NrK   r,   r-   r&   rL   )rE   Ú
isinstancer   Ú	isoformat)r?   Úmsgr$   s     €r   Úconvert_doczGChatHistoryService.get_all_chats_with_user_details.<locals>.convert_docÓ   sÏ   ø€ Ø˜‰|Ü   U¡›_��E‘
Ø˜CÑ¤J¨s°9©~¸xÔ$HÜ!$ S¨¡^Ó!4��I‘Ø Ñ$Ø˜~Ñ.ò H�CØ" cÒ)¬j¸¸[Ñ9IÌ8Õ.TØ+.¨{Ñ+;×+EÑ+EÓ+G˜˜KÒ(ðHð  Ñ$¨¨^Ò)<Ø˜C Ñ/Ñ/Ü14°S¸Ñ5HÈÑ5OÓ1P�C˜Ñ'¨Ñ.ØˆJr   )ÚtotalrG   r8   Útotal_pagesÚchats)r/   r$   r   Úcount_documentsÚ	aggregateÚto_list)r   rG   r8   ÚskipÚtotal_countÚpipelineÚcursorÚresultsrX   r?   r$   s             @r   Úget_all_chats_with_user_detailsz2ChatHistoryService.get_all_chats_with_user_details¯   sý   øè ø€ õ 	"à�q‘˜EÑ!ˆð !ŸO™O×;Ñ;¸BÓ?×?ˆð �dˆOØ�uÐàØ$Ø"+Ø$)Ø(ñ	ðð Ø+Ø26ñðð
ˆð& —‘×*Ñ*¨8Ó4ˆØŸ™¨e˜Ó4×4ˆô	ð 07Ö7¨‘;˜sÕ#Ð7ˆÐ7ð !ØØØ'¨%Ñ/°!Ñ3¸Ñ=Øñ
ð 	
ðS @øð, 5úò" 8ùs4   ƒ-B4°B+±A
B4Á;B-Á<B4Â	B/ÂB4Â-B4Â/B4)NNr*   )r;   Nr   )rI   é   )Ú__name__Ú
__module__Ú__qualname__r   Úpropertyr   rE   r7   Úintr   r   r   rA   rF   rd   © r   r   r
   r
      s×   „ ò ð
 ñ ó ð ñ/
°ð /
¸Cð /
È#ð /
ÐZ]ð /
Ðtwð /
ð  ILó /
ñd*¸ð *ÀCð *ÐVYð *ÐeiÐjnÐorÐtwÐowÑjxÑeyó *ñX7
°cð 7
À3ð 7
ÐRVÐWZÐ\_ÐW_ÑR`ó 7
ñr:
¸#ð :
È#ð :
ÐW[Ð\_ÐadÐ\dÑWeô :
r   r
   )r   Útypingr   r   r   Úmotor.motor_asyncior   Úsrc.core.configr   Úosr
   Úhistory_servicerk   r   r   ú<module>rq      s.   ðÝ ß "Ñ "Ý 2Ý $Û 	÷b
ñ b
ñH %Ó&�r   