
    'j<                        d 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	 ddl
mZ ddlmZ ddlmZmZmZmZmZmZmZmZmZ dd	lmZmZ  G d
 de          Z G d de          Z G d de          Z G d de          ZdedefdZde	de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%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)de	defdZ*d S )!zaConversation history API endpoints.

Provides endpoints for managing conversations and messages.
    )OptionalListAny)datetime)	BaseModel)Request)JSONResponse)logger)	create_conversationget_conversationsget_conversationupdate_conversation_titledelete_conversationsave_messageget_messagestoggle_bookmarkget_user_bookmarks)get_user_by_usernamedecode_access_tokenc                   .    e Zd ZU dZdZee         ed<   dS )CreateConversationRequestz%Request to create a new conversation.zNew ChattitleN)__name__
__module____qualname____doc__r   r   str__annotations__     I/var/www/html/ai-enterprise-brain/backend/chanakya/conversation/router.pyr   r      s,         //%E8C=%%%%%r    r   c                       e Zd ZU dZeed<   eed<   dZee         ed<   dZee         ed<   dZ	ee
         ed<   dZee         ed<   dS )	SaveMessageRequestzRequest to save a message.messagemessage_authorNmessage_type	sql_querymetadataparent_message_id)r   r   r   r   r   r   r&   r   r'   r(   dictr)   intr   r    r!   r#   r#   $   s~         $$LLL"&L(3-&&&#Ix}####Hhtn###'+x}+++++r    r#   c                       e Zd ZU dZeed<   dS )UpdateTitleRequestz%Request to update conversation title.r   N)r   r   r   r   r   r   r   r    r!   r-   r-   .   s         //JJJJJr    r-   c                       e Zd ZU dZeed<   dS )ToggleBookmarkRequestz0Request to set or clear a bookmark on a message.
bookmarkedN)r   r   r   r   boolr   r   r    r!   r/   r/   3   s$         ::r    r/   objreturnc                     t          | t                    rd |                                 D             S t          | t                    rd | D             S t          | t                    r|                                 S | S )zFConvert datetime objects to ISO format strings for JSON serialization.c                 4    i | ]\  }}|t          |          S r   serialize_for_json).0keyvalues      r!   
<dictcomp>z&serialize_for_json.<locals>.<dictcomp>?   s'    MMM:3'..MMMr    c                 ,    g | ]}t          |          S r   r6   )r8   items     r!   
<listcomp>z&serialize_for_json.<locals>.<listcomp>A   s!    999T"4((999r    )
isinstancer*   itemslistr   	isoformat)r2   s    r!   r7   r7   <   s{    #t MMMMMM	C		 99S9999	C	"	" }}Jr    requestc                   K   | j                             dd          }t          j        d|r
|dd         nd d           |                    d          s!t          j        d	|dd
                     dS |                    dd          }t          j        d|dd
          d           t          |          }|st          j        d           dS |                    d          }|st          j        d           dS t          j        d|            t          |           d{V }|rt          j        d|            nt          j        d|            |S )zExtract and verify user from JWT token in Authorization header.
    
    Returns:
        User dict if valid token, None otherwise
    authorization z"[CONV-AUTH] Authorization header: N2   MISSINGz...zBearer z([CONV-AUTH] Invalid auth header format:    z[CONV-AUTH] Extracted token: z[CONV-AUTH] Token decode failedsubz([CONV-AUTH] No username in token payloadz"[CONV-AUTH] Token valid for user: z$[CONV-AUTH] User found in database: z([CONV-AUTH] User not found in database: )	headersgetr
   debug
startswithwarningreplacer   r   )rC   auth_headertokenpayloadusernameusers         r!   get_current_user_from_tokenrV   G   s      /%%or::K
Li+6dk#2#6F6F[diiijjj!!),, T+crcBRTTUUUt	2..E
L@ss@@@AAA!%((G 8999t{{5!!H ABBBt
L@h@@AAA%h////////D NFHFFGGGGL(LLMMMKr    c                   K   	 t          |            d{V }|st          ddid          S |                                  d{V }t          d
i |}|d         }t	          ||j        |           d{V }t          t          |                    S # t          $ r-}t          ddt          |           id	          cY d}~S d}~ww xY w)z0POST /conversations - Create a new conversation.NdetailAuthentication required  status_codeid)user_idr   
created_byzFailed to create conversation:   r   )	rV   r	   jsonr   r   r   r7   	Exceptionr   )rC   rU   bodyreqr^   conversationes          r!   create_conversation_handlerrg   q   sS     
099999999 	45    \\^^######'//$// t*0)
 
 
 
 
 
 
 
 
 .|<<=== 
 
 
AQAAB
 
 
 	
 	
 	
 	
 	
 	

s#   )B A&B 
C"CCCc                 x  K   	 t          |            d{V }|st          ddid          S 	 t          dt          dt	          | j                            dd	                                        }t          d
t	          | j                            dd
                              }n# t          t          f$ r d\  }}Y nw xY w|d         }t          |||           d{V }t          t          |                    S # t          $ r-}t          ddt          |           id          cY d}~S d}~ww xY w)zGET /conversations - Get paginated conversations for current user.

    Query params:
        limit  (int, default 10): number of conversations per page
        offset (int, default 0):  number to skip
    NrX   z Authentication requiredrZ   r[      rG   limit
   r   offset)rk   r   r]   )r^   rj   rl   zFailed to get conversations: r`   )rV   r	   maxminr+   query_paramsrL   	TypeError
ValueErrorr   r7   rb   r   )rC   rU   rj   rl   r^   resultrf   s          r!   get_conversations_handlerrs      s     
099999999 	56   	"3r3w';'?'?'L'L#M#MNNOOEC 4 8 81 E EFFGGFF:& 	" 	" 	"!ME666	" t*(fUUUUUUUUU.v66777 
 
 
?s1vv??@
 
 
 	
 	
 	
 	
 	
 	

sA   )D A:B* )D *C D C>D 
D9"D4.D94D9c                 (  K   	 t          |            d{V }|st          ddid          S t          | j                            d                    }t          |           d{V }|st          ddid          S |d	         }|d
         |k    rt          ddid          S t          |           d{V }t          t          ||d                    S # t          $ r-}t          ddt          |           id          cY d}~S d}~ww xY w)zFGET /conversations/{conversation_id} - Get conversation with messages.NrX   rY   rZ   r[   conversation_idConversation not found  r]   r^   Access denied  )re   messageszFailed to get conversation: r`   )
rV   r	   r+   path_paramsrL   r   r   r7   rb   r   )rC   rU   ru   re   r^   rz   rf   s          r!   get_conversation_handlerr|      s     (
099999999 	45    g1556GHHII .o>>>>>>>> 	34    t*	"g--?+    &o66666666.( 0
 0
     	
  
 
 
>c!ff>>?
 
 
 	
 	
 	
 	
 	
 	

s/   )C AC ?&C &3C 
D$"DDDc                    K   	 t          |            d{V }|st          ddid          S t          | j                            d                    }|                                  d{V }t          di |}|d         }t          ||j        |           d{V }|st          dd	id
          S t          ddi          S # t          $ r-}t          ddt          |           id          cY d}~S d}~ww xY w)zGPUT /conversations/{conversation_id}/title - Update conversation title.NrX   rY   rZ   r[   ru   r]   )ru   r   
updated_byrv   rw   successTzFailed to update title: r`   r   )rV   r	   r+   r{   rL   ra   r-   r   r   rb   r   )rC   rU   ru   rc   rd   r^   updatedrf   s           r!   !update_conversation_title_handlerr      s     $
099999999 	45    g1556GHHII \\^^###### ((4(( t*1+)
 
 
 
 
 
 
 
 
  	34   
 Y-... 
 
 
:#a&&::;
 
 
 	
 	
 	
 	
 	
 	

s)   )C BC 5C 
C="C82C=8C=c                   K   	 t          |            d{V }|st          ddid          S t          | j                            d                    }|d         }t          ||           d{V }|st          dd	id
          S t          ddi          S # t          $ r-}t          ddt          |           id          cY d}~S d}~ww xY w)z@DELETE /conversations/{conversation_id} - Delete a conversation.NrX   rY   rZ   r[   ru   r]   )ru   
deleted_byrv   rw   r   TzFailed to delete conversation: r`   )rV   r	   r+   r{   rL   r   rb   r   )rC   rU   ru   r^   deletedrf   s         r!   delete_conversation_handlerr     sd     
099999999 	45    g1556GHHII t*++
 
 
 
 
 
 
 
 

  	34   
 Y-... 
 
 
AQAAB
 
 
 	
 	
 	
 	
 	
 	

s)   )B AB 	B 
C$"CCCc           
      P  K   	 t          |            d{V }|st          ddid          S t          | j                            d                    }|                                  d{V }t          di |}|d         }t          ||j        |j	        |j
        |j        |j        |j        |           d{V }t          t          |                    S # t          $ rA}t!          j        |           t          dd	t%          |           id
          cY d}~S d}~ww xY w)z@POST /conversations/{conversation_id}/messages - Save a message.NrX   rY   rZ   r[   ru   r]   )ru   r%   r$   r&   r'   r(   r)   r_   zFailed to save message: r`   r   )rV   r	   r+   r{   rL   ra   r#   r   r%   r$   r&   r'   r(   r)   r7   rb   r
   	exceptionr   )rC   rU   ru   rc   rd   r^   r$   rf   s           r!   save_message_handlerr   3  s     %
099999999 	45    g1556GHHII \\^^###### ((4(( t*$+-K)m\!3	
 	
 	
 	
 	
 	
 	
 	
 	
 .w77888 
 
 
:#a&&::;
 
 
 	
 	
 	
 	
 	
 	

s#   )C B+C 
D%$6D D% D%c                   K   	 t          | j                            d                    }t          j        d|            t          |            d{V }|s*t          j        d|            t          ddid          S t          j        d	|                    d
                      t          |           d{V }|s+t          j        d| d           t          ddid          S |d         }|d         |k    r-t          j        d| d|            t          ddid          S t          |           d{V }t          j        dt          |           d|            t          |          D ]q\  }}t          |                    d                    }t          j        d|dz    d|                    d           d|                    d           d| d	           rt          t          |                    S # t          $ re}	t          j        d t#          |	                      t          j        |	           t          dd!t#          |	           id"          cY d}	~	S d}	~	ww xY w)#zTGET /conversations/{conversation_id}/messages - Get all messages for a conversation.ru   z)[GET-MSGS] Get messages for conversation Nz2[GET-MSGS] Authentication failed for conversation rX   rY   rZ   r[   z[GET-MSGS] User authenticated: rT   z[GET-MSGS] Conversation z
 not foundrv   rw   r]   r^   z"[GET-MSGS] Access denied for user z to conversation rx   ry   u   [GET-MSGS] ✅ Found z messages for conversation r(   z[GET-MSGS]   Message ri   z: r%   z - r&   z (metadata: )u   [GET-MSGS] ❌ Error: zFailed to get messages: r`   )r+   r{   rL   r
   inforV   rO   r	   r   r   len	enumerater1   rM   r7   rb   errorr   r   )
rC   ru   rU   re   r^   rz   imsghas_metadatarf   s
             r!   get_messages_handlerr   ]  sM     0
g1556GHHIIQQQRRR 199999999 	NaP_aabbb45   
 	Ldhhz6J6JLLMMM .o>>>>>>>> 	NQoQQQRRR34   
 t*	"g--NkkkZikklll?+    &o66666666gCMMggVegghhh)) 	L 	LFAs
 3 344LL  K1  K  K@P8Q8Q  K  KVYV]V]^lVmVm  K  K  |H  K  K  K  L  L  L  L.x88999 
 
 
6c!ff66777:#a&&::;
 
 
 	
 	
 	
 	
 	
 	

s4   A>H	 A+H	 /A H	 0CH	 	
I8AI3-I83I8c                 0  K   	 t          |            d{V }|st          ddid          S t          | j                            d                    }t          | j                            d                    }t          |           d{V }|st          ddid	          S |d
         |d         k    rt          ddid          S |                                  d{V }t          di |}t          ||j	                   d{V }|st          ddid	          S |d         |k    rt          ddid	          S t          |d         |d         d          S # t          $ r-}t          ddt          |           id          cY d}~S d}~ww xY w)zEPATCH /conversations/{conversation_id}/messages/{message_id}/bookmarkNrX   rY   rZ   r[   ru   
message_idrv   rw   r^   r]   rx   ry   zMessage not foundr0   )r]   r0   zFailed to toggle bookmark: r`   r   )rV   r	   r+   r{   rL   r   ra   r/   r   r0   rb   r   )	rC   rU   ru   r   re   rc   rd   rr   rf   s	            r!   toggle_bookmark_handlerr     s!     
099999999 	X+D ESVWWWWg1556GHHII,00>>??
-o>>>>>>>> 	W+C DRUVVVV	"d4j00? ;MMMM\\^^#######++d++&z3>BBBBBBBB 	R+> ?SQQQQ#$77+> ?SQQQQ6$<vl?STTUUU 
 
 
=SVV==>
 
 
 	
 	
 	
 	
 	
 	

s<   )E A7E &$E AE !E  E 
F("F
FFc                 >  K   	 t          |            d{V }|st          ddid          S t          |d                    d{V }t          t          |                    S # t          $ r-}t          ddt          |           id          cY d}~S d}~ww xY w)	zGET /users/me/bookmarksNrX   rY   rZ   r[   r]   zFailed to get bookmarks: r`   )rV   r	   r   r7   rb   r   )rC   rU   	bookmarksrf   s       r!   get_user_bookmarks_handlerr     s      
099999999 	X+D ESVWWWW,T$Z88888888	.y99::: 
 
 
;3q66;;<
 
 
 	
 	
 	
 	
 	
 	

s"   )A% 6A% %
B/"BBBN)+r   typingr   r   r   r   pydanticr   starlette.requestsr   starlette.responsesr	   logurur
   &backend.chanakya.conversation.databaser   r   r   r   r   r   r   r   r   backend.chanakya.authr   r   r   r#   r-   r/   r7   r*   rV   rg   rs   r|   r   r   r   r   r   r   r   r    r!   <module>r      sG   
 ' & & & & & & & & &             & & & & & & , , , , , ,      
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 L K K K K K K K& & & & &	 & & &
, , , , , , , ,       
    I   C C    #w #8D> # # # #T
w 
< 
 
 
 
@!
W !
 !
 !
 !
 !
H*
G *
 *
 *
 *
 *
Z&
W &
 &
 &
 &
 &
R!
w !
< !
 !
 !
 !
P'
 '
L '
 '
 '
 '
T2
 2
L 2
 2
 2
 2
r!
7 !
| !
 !
 !
 !
H
g 
, 
 
 
 
 
 
r    