o
    g                  
   @   s   d dl mZ d dlmZ d dlmZmZ d dlmZ d dl	m
Z
 d dlmZ d dlZedZd	ed
edededef
ddZd	edededee fddZd	ededee fddZd	eded
efddZd	ededee fddZdS )    )List)Session)funccase)Message)ExpoPushNotificationService)UserN	adimsayardb	sender_idreceiver_idcontentreturnc           	      C   s8  t |||d}| | |   | | zi| ttj|k }t	
d|  |rA|jp1d d|jp7d  }|s@d}nt	d| d d}|dd	 t|d	krYd
nd }tj| |d| |d||j|dddd t	
d| d|  W |S  ty } zt	dt|  W Y d}~|S d}~ww )zU
    Creates a new message record in the database and sends a push notification.
    )r   r   r   zSender:   ZSomeonezSender with id z
 not foundN2   z...zNew message from messageT)typer   
message_idZconversation_idZis_chatnew_message)r
   user_idtitler   datanotification_typez Message notification sent: user z to z"Message push notification failed: )r   addcommitrefreshqueryr   filteridfirstloggerinfo
first_name	last_namestriperrorlenr   send_push_to_user	Exceptionstr)	r
   r   r   r   r   senderZsender_nameZpreviewe r-   $/app/app/services/message_service.pycreate_message   sF   

 r/   user1_iduser2_idc                 C   s@   |  ttj|ktj|k@ tj|ktj|k@ B tj S )zS
    Retrieves all messages exchanged between two users, ordered by sent time.
    )r   r   r   r   r   order_bysent_atall)r
   r0   r1   r-   r-   r.   get_messages_between_users;   s   
r5   c                 C   s*   |  ttj|ktjdktj S )z9
    Retrieves all unread messages for the receiver.
    F)r   r   r   r   is_readr2   r3   r4   )r
   r   r-   r-   r.   get_unread_messagesD   s   
r7   c                 C   sF   |  ttj|ktj|ktjdk }|D ]}d|_q|   |S )zS
    Marks all messages from a specific sender as read for the given receiver.
    FT)r   r   r   r   r   r6   r4   r   )r
   r   r   messagesmsgr-   r-   r.   mark_messages_as_readM   s   
r:   r   c                 C   s   |  ttjdttj|ktjftjdd	tj|ktj|kB 
d }|  t|tj|jjktj|ktj|jjk@ tj|ktj|jjk@ B @ tj  }|S )u   
    Retrieves conversation threads for the given user.
    각 스레드는 대화 상대(친구)와의 최신 메시지를 포함합니다.
    latest_sent_at)else_	friend_id)r   r   maxr   r3   labelr   r   r   r   group_bysubqueryjoincr;   r=   r2   descr4   )r
   r   rA   threadsr-   r-   r.   get_conversation_threads[   s6   rF   )typingr   sqlalchemy.ormr   
sqlalchemyr   r   Zapp.models.messager   +app.services.expo_push_notification_servicer   app.models.userr   logging	getLoggerr!   intr*   r/   r5   r7   r:   rF   r-   r-   r-   r.   <module>   s   
/		