o
    g                     @   sb   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fd
dZdS )    )Session)Advertisement)AdvertisementClickRecord)PointTransaction)
UserPoints)nowdbuser_idad_idc           	      C   s  |  ttj|k }|std|  ttj|ktj|k }|r*tdt||d}| 	| |j
}t|d|dd}| 	| |  ttj|k }|r\| j|7  _nt||d}| 	| |   td |   | | | | | | ||||d	S )
u  
    광고 클릭 시 포인트를 지급하고, 광고 상태와 사용자 포인트를 업데이트합니다.
    
    Steps:
    1. 광고(Advertisement)를 조회하여 존재 여부와 클릭 여부를 확인합니다.
    2. 새로 만든 AdvertisementClickRecord 테이블을 통해, 해당 유저가 이미 광고를 클릭했는지 검사합니다.
    3. 기록이 없으면 새 AdvertisementClickRecord를 생성합니다.
    4. 광고의 포인트(ad_video_points)를 이용해 PointTransaction 기록을 추가합니다.
    5. UserPoints 테이블에서 해당 사용자의 총 포인트를 업데이트하거나, 없으면 생성합니다.
    6. 모든 변경을 DB에 커밋합니다.
    
    Returns a dictionary with advertisement, point_transaction and user_points.
    zAdvertisement not foundz*Advertisement already clicked by this user)r	   advertisement_idetczAdvertisement click reward)r	   transaction_typeamountdescription)r	   total_pointsz7Flushed records: ad_click_record, point_tx, user_points)advertisementad_click_recordpoint_transactionuser_points)queryr   filteridfirst	Exceptionr   r	   r   addad_video_pointsr   r   r   flushprintcommitrefresh)	r   r	   r
   adZexisting_clickr   pointspoint_txr    r#   */app/app/services/advertisement_service.pyprocess_advertisement_click   sP   






r%   N)sqlalchemy.ormr   app.models.advertisementr   Z%app.models.advertisement_click_recordr   app.models.point_transactionr   app.models.user_pointsr   app.core.timer   intr%   r#   r#   r#   r$   <module>   s    