o
    Yg                     @   s  d dl mZ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mZ d dlmZ d d	lmZ 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defddZd d
ededededef
ddZd
ededededef
ddZd
edededefddZdS )!    )ListDict)Session)or_case)datetime)
Friendship)User)UserReferral)message_service)HTTPExceptiondbuser_idreturnc           
      C   s   t tj|ktjftjdd}| ttjtjtj	|
ttj|ktjtjk@ tj|ktjtjk@ B tjdk }i }|D ]\}}}}}	|	|vr]|j|	||||j|j|jdd	||	< q@t| S )u   
    기존 Friendship 테이블에서 직접 추가된 친구 목록을 조회합니다.
    computed_friend_id를 기준으로 중복 제거합니다.
    else_computed_friend_idaccepted
friendship)	id	friend_id
first_name	last_nameprofile_imagestatus
created_at
updated_atsource)r   r   r   r   labelqueryr	   r   r   r   joinr   filterr   allr   r   listvalues)
r   r   r   friendship_rows
friend_mapr   r   r   r   comp_friend_id r(   '/app/app/services/friendship_service.pyget_friend_list   sJ   
r*   c                 C   s   t tj|ktjftjdd}| ttjtjtj	tjtj|
tttj|ktjtjk@ tj|ktjtjk@ tjg d }i }|D ]%\}}}}}	}
}|
|k}||vrm|j|	|
|||||j|j|j|d||< qHt| S )z
    Retrieve the friend list and include additional information:
      - requested_by / requested_to (who sent/received the friend request)
      - is_request_received flag (true if the logged in user is the recipient)
    r   r   )pendingr   blocked)r   requested_byrequested_tor   r   r   r   r   r   r   is_request_received)r   r   r   r   r   r   r	   r   r   r   r    r   r   r!   r   in_r"   r   r   r#   r$   )r   r   r   r%   r&   r   r   r   r   r-   r.   r'   r/   r(   r(   r)   get_extended_friend_list7   sV   	
r1   r   current_user_idc                 C   sx   |j }|j}||kr|n|}||k}| ttj|k }|s'tddd|j||||j|j	|j
|j||j|jdS )a=  
    Serialize a Friendship instance so the response includes:
      - requested_by: original requester (friendship.user_id)
      - requested_to: recipient (friendship.friend_id)
      - is_request_received: whether the current user is the recipient.
      - friend_id: the 'other' user's id (convenience field)
      zFriend not foundstatus_codedetail)r   r-   r.   r   r   r   r   r   r/   r   r   )r   r   r   r	   r!   r   firstr   r   r   r   r   r   r   )r   r   r2   r-   r.   r   r/   Zfriendr(   r(   r)   _serialize_friendshipk   s&   r8   r   r   r   c                 C   s   |  tttj|ktj|k@ tj|ktj|k@  }|r%t| ||S t|||d}| | | 	  | 
| t| ||S )u   
    두 사용자 간의 친구 관계를 생성합니다.
    이미 동일한 관계가 존재하면 해당 레코드를 직렬화하여 반환합니다.
    )r   r   r   )r   r   r!   r   r   r   r7   r8   addcommitrefresh)r   r   r   r   existingZnew_friendshipr(   r(   r)   create_friendship   s&   


r=   
new_statusc                 C   sn   |  tttj|ktj|k@ tj|ktj|k@  }|s%tddd||_| 	  | 
| t| ||S )u4  
    현재 사용자와 friend_id 간의 친구 관계 상태를 변경하고, 
    응답으로 FriendsResponse에 정의된 필드를 포함한 딕셔너리를 반환합니다.
    new_status는 "accepted", "blocked", (또는 enum에 추가할 경우 "rejected") 등으로 지정할 수 있습니다.
    r3   Friendship not foundr4   r   r   r!   r   r   r   r7   r   r   r:   r;   r8   )r   r2   r   r>   r   r(   r(   r)   update_friendship_status   s   

rA   c                 C   sn   |  tttj|ktj|k@ tj|ktj|k@  }|s%tdddd|_| 	  | 
| t| ||S )u   
    현재 사용자와 friend_id 간의 친구 관계를 삭제하는 대신,
    상태를 'blocked'로 업데이트하며,  
    응답으로 FriendshipResponse 스키마에 맞는 데이터를 포함한 딕셔너리를 반환합니다.
    r3   r?   r4   r,   r@   )r   r2   r   r   r(   r(   r)   delete_friendship   s   

rB   N)r   )typingr   r   sqlalchemy.ormr   
sqlalchemyr   r   r   Zapp.models.friendshipr   app.models.userr	   app.models.user_referralr
   app.servicesr   fastapir   intr*   dictr1   r8   strr=   rA   rB   r(   r(   r(   r)   <module>   s    ,4 "