o
    g$                     @   s  d dl mZmZmZmZ d dlmZmZmZm	Z	m
Z
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Zd d
lZd d
lZd d
l Z e!dZ"e Z#dZ$ej%e$dd eej&ej'ej(ej)e*edd
dZ+G dd deZ,G dd deZ-e#j.dej/deded
eej0fde1dee
 dedefddZ2e#j3deej/ dd deej0fd e4d!e4dedefd"d#Z5e#j3d$eej6 deej0fdedefd%d&Z7e#j3d'ej/deej0fd(e4dedefd)d*Z8e#j9d'ej/deded
eej0fd(e4de1dee
 dedef
d+d,Z:e#.d-eej0fd.e,dedefd/d0Z;e#j<d'ej/deej0fd(e4dedefd1d2Z=e#j9d3ej/deej0eej>fd4e-defd5d6Z?e#.d7eej0fd(e4d8e4defd9d:Z@d
S );    )ListAnyDictOptional)	APIRouterDependsHTTPExceptionstatus
UploadFileFileForm)Session)	BaseModelField)deps)user)UserService)MediaService)settingsN	adimsayarzuploads/profile_imagesT)exist_ok
AWS_REGION)s3_endpoint_urlbucket_name
access_key
secret_keyregion_namec                   @   s   e Zd ZU eed< eed< dS )LoginRequestusernamepasswordN)__name__
__module____qualname__str__annotations__ r%   r%   "/app/app/api/v1/endpoints/users.pyr       s   
 r   c                   @   s$   e Zd ZU eddddZeed< dS )StepNotificationSettingsUpdate.r   
   )gelenotification_frequencyN)r    r!   r"   r   r+   intr$   r%   r%   r%   r&   r'   $   s   
 r'   z	/register)response_model.user_inprofile_imagedbreturnc              
      s   z<t | }tjdi |}t||jrttj	dd|r)t
|d}||_nd|_t||}td|j  |W S  tyE     tyc } ztjdt| dd ttjd	dd
}~ww )z
    Register a new user with an optional profile image.
    
    Expected form-data:
    - user_in: JSON string containing the registration data.
    - profile_image: (Optional) file upload for the profile image.
    zEmail already registeredstatus_codedetailprofilezprofile/default_avatar.pngzSuccessfully registered user: zRegistration failed: Texc_infoz)Internal server error during registrationNr%   )jsonloadsuser_schemas
UserCreater   get_user_by_emailemailr   r	   HTTP_400_BAD_REQUESTmedia_clientupload_imager/   create_userloggerinfo	Exceptionerrorr#   HTTP_500_INTERNAL_SERVER_ERROR)r.   r/   r0   	user_dataZuser_payloadfile_urlr   er%   r%   r&   register_user'   s4   
rJ   /d   skiplimitc                 C   s   t j|| |dS )zGet list of users)rM   rN   )r   	get_users)rM   rN   r0   r%   r%   r&   rO   U   s   rO   z/referral-codesc              
   C   sP   zt | }|W S  ty' } ztjdt| dd ttjddd}~ww )z/Get list of referral codes for all active userszError fetching referral codes: Tr6   zError fetching referral codesr2   N)	r   get_all_referral_codesrD   rB   rE   r#   r   r	   rF   )r0   referral_codesrI   r%   r%   r&   get_referral_codes^   s   
rR   z
/{user_id}user_idc                 C   "   t || }|sttjdd|S )zGet user by IDUser not foundr2   )r   get_userr   r	   HTTP_404_NOT_FOUNDrS   r0   r   r%   r%   r&   rV   h   s   rV   c           	   
      s   z+t |}tjdi |}|rt|d}||_t|| |}|s*t	t
jdd|W S  t	y4     tyT } ztjdt| dd t	t
jt|dd}~ww )	zG
    Update user information, including an optional profile image.
    r5   rU   r2   zError updating user: Tr6   Nr%   )r8   r9   r:   
UserUpdater?   r@   r/   r   update_userr   r	   rW   rD   rB   rE   r#   rF   )	rS   r.   r/   r0   rG   Zupdate_payloadrH   r   rI   r%   r%   r&   rZ   s   s0   

rZ   z/login
login_datac              
   C   s   z"t j|| j| jd}|sttjdddidtd| j  |W S  ty*     t	yH } ztj
dt| dd	 ttjd
dd}~ww )z
    Login endpoint accepting credentials via a JSON payload.
    
    Expected JSON body:
    {
        "username": "user@example.com",
        "password": "secret123"
    }
    )r=   r   zInvalid credentialszWWW-AuthenticateBearer)r3   r4   headerszSuccessful login: zLogin failed: Tr6   zAuthentication process failedr2   N)r   authenticate_userr   r   r   r	   HTTP_401_UNAUTHORIZEDrB   rC   rD   rE   r#   rF   )r[   r0   resultrI   r%   r%   r&   login   s0   ra   c                 C   rT   )z3
    Delete a user by setting its status to 0.
    rU   r2   )r   delete_userr   r	   rW   rX   r%   r%   r&   rb      s   rb   z/step-notification-settingsr   c                 C   sN   | tjtjj|jk }|stddd| j|_|	  |
| |S )uE   사용자의 걸음수 알림 빈도 설정을 업데이트합니다.  rU   r2   )queryr:   Userfilteridfirstr   r+   step_notification_frequencycommitrefresh)r   r0   current_userr   r%   r%   r&   !update_step_notification_settings   s    
rm   z/push-step-notificationsteps_countc           
   
   C   s   ddl m} ddlm} ddlm} ddlm} ||	|j
| k }|s-tddd| }||	|j| k|j|k }	|	d	u ra|| ||dd
d
ddd}	||	 |  ||	 n||	_|  ||	 ||| |	 d| |dS )u  
    임시 테스트용 엔드포인트:
    주어진 user_id와 steps_count를 기반으로 오늘 날짜의 걸음 기록을 생성하거나 업데이트한 후,
    check_and_send_step_notification 함수를 호출하여 알림 전송 여부를 확인합니다.
    
    Request 파라미터:
    - user_id: 테스트할 유저의 ID
    - steps_count: 테스트할 걸음 수
    
    응답:
    - 알림 발송 로직이 실행되었음을 확인하는 메시지
    r   )date)re   )
StepRecord) check_and_send_step_notificationrc   rU   r2   Ng        Ftest)rS   record_datern   points_earnedcalories_burneddistance_kmgoal_achievedsync_sourcezTest notification triggered)messagerS   rn   )datetimero   app.models.userre   Zapp.models.step_recordrp   Z app.services.step_record_servicerq   rd   rf   rg   rh   r   todayrS   rs   addrj   rk   rn   )
rS   rn   r0   ro   re   rp   rq   r   r|   step_recordr%   r%   r&   push_step_notification   sB   



r   )Atypingr   r   r   r   fastapir   r   r   r	   r
   r   r   sqlalchemy.ormr   pydanticr   r   Zapp.apir   Zapp.schemasr   r:   app.services.user_servicer   app.services.media_servicer   app.core.configr   loggingosuuidr8   	getLoggerrB   router
UPLOAD_DIRmakedirsAWS_S3_ENDPOINT_URLAWS_S3_BUCKETAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYgetattrr?   r   r'   postre   get_dbr#   rJ   getr,   rO   UserReferralCoderR   rV   putrZ   ra   deleterb   get_current_userrm   r   r%   r%   r%   r&   <module>   s   $

	-	"
"'"