o
    `g)                     @   s  d dl mZmZmZmZmZ d dlmZmZm	Z	m
Z
 d dlmZ d dlmZmZmZ d dlm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mZ d d
lZe ZG dd deZe deefdedede
fddZ!ej"dee ded
ddeeeefdee# dedefddZ$ej"deded
ddeeeefde#dee# dedefddZ%ej&deded
d deeeefde#d!edee# dedef
d"d#Z'e"d$eeeefdedefd%d&Z(G d'd( d(eZ)ej"d)ee) deefdefd*d+Z*G d,d- d-eZ+G d.d/ d/eZ,ej&d0e,deefd1e-d2e+defd3d4Z.ej/d5e	e#e
f deefd6e-defd7d8Z0ej"d9ee	e#e
f  ded d:ded;d<deefd=e-d>e-defd?d@Z1G dAdB dBeZ2ej&dCe	e#e
f deefdDe-dEe2defdFdGZ3G dHdI dIeZ4ej dJe	e#e
f deefdKe4defdLdMZ5ej/dNe	e#e
f deefdOe-defdPdQZ6d
S )R    )	APIRouterDependsHTTPExceptionQuerystatus)ListOptionalDictAny)Session)	BaseModelEmailStrField)datetime)get_dbget_current_userget_current_admin_user)User)admin_service)AdminSettingResponseAdminSettingUpdateNc                   @   s   e Zd ZU eed< eed< dS )AdminLoginRequestusernamepasswordN)__name__
__module____qualname__str__annotations__ r   r   "/app/app/api/v1/endpoints/admin.pyr      s   
 r   z/login
login_datadbreturnc              
   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	yJ } ztj
dt| dd	 ttjt|d
d}~ww )u	  
    관리자 로그인 엔드포인트.
    
    일반 로그인과 동일하지만 관리자 사용자만 로그인 할 수 있습니다.
    
    Expected JSON body:
    {
        "username": "admin@example.com",
        "password": "admin_password"
    }
    )emailr   zInvalid admin credentialszWWW-AuthenticateBearer)status_codedetailheaderszSuccessful admin login: zAdmin login failed: Texc_infor&   r'   N)r   authenticate_adminr   r   r   r   HTTP_401_UNAUTHORIZEDlogginginfo	Exceptionerrorr   HTTP_500_INTERNAL_SERVER_ERROR)r!   r"   resulter   r   r    admin_login   s0   r5   z	/settings)response_modelzFilter settings by country codedescriptioncountry_codecurrent_userc                 C      t || S )u   
    모든 관리자 설정을 조회합니다.
    country_code가 제공되면 해당 국가별 설정만 반환합니다.
    관리자 권한이 필요합니다.
    )r   get_all_settings)r9   r"   r:   r   r   r    r<   ?   s   r<   z/settings/{setting_name}z Get setting for specific countrysetting_namec                 C   s<   t || |}|st || |}tdd|  d| d|S )u   
    특정 설정을 조회합니다.
    country_code가 제공되면 해당 국가별 설정을 조회합니다.
    관리자 권한이 필요합니다.
    i  z	Setting 'z' not found. Default value: r+   )r   get_settingget_setting_valuer   )r=   r9   r"   r:   settingvaluer   r   r    r>   L   s   r>   z#Update setting for specific countrysetting_datac                 C   s   t || ||S )u   
    설정을 업데이트합니다.
    country_code가 제공되면 해당 국가별 설정을 업데이트합니다.
    설정이 없는 경우 새로 생성합니다.
    관리자 권한이 필요합니다.
    )r   update_setting)r=   rB   r9   r"   r:   r   r   r    rC   b   s   rC   z/settings/defaultc                 C   s   t |  ddiS )u   
    기본 설정 값을 생성합니다. 이미 존재하는 설정은 변경하지 않습니다.
    관리자 권한이 필요합니다.
    messagez%Default settings created successfully)r   ensure_default_settings)r"   r:   r   r   r    create_default_settingsr   s   
	rF   c                   @   s>   e Zd ZU eed< eed< eed< eed< eed< eed< dS )UserPointsInfouser_idr$   
first_name	last_nametotal_points
updated_atNr   r   r   intr   r   r   r   r   r   r    rG      s   
 rG   z/user-pointsc              
   C   sZ   zt | }|W S  ty, } ztjdt| dd ttjdt| dd}~ww )u   
    모든 사용자의 포인트 정보를 조회합니다.
    
    로그인 여부와 관계없이 접근 가능합니다.
    z Failed to retrieve user points: Tr)   u:   포인트 정보 조회 중 오류가 발생했습니다: r+   N)	r   get_all_user_pointsr0   r.   r1   r   r   r   r2   )r"   user_pointsr4   r   r   r    rO      s   	
rO   c                   @   s   e Zd ZU eddddZeed< eddddZeed< eed< eddd	Z	eed
< eddd	Z
eed< eddd	Zeed< eddd	Zeed< eddddZeed< eddddZeed< dS )AdminUserUpdate.   2   )
min_length
max_lengthrI   rJ   r$   z^\+?[0-9]{1,4}$)pattern
phone_codez^[0-9]{10,15}$phonez^[MF]$genderz^\d{4}-\d{2}-\d{2}$
birth_datei  i )geledaily_step_goalr      r   N)r   r   r   r   rI   r   r   rJ   r   rW   rX   rY   rZ   r]   rN   r   r   r   r   r    rQ      s   
 rQ   c                   @   sf   e Zd ZU eed< eed< eed< eed< eed< eed< eed< eed< eed	< eed
< eed< dS )AdminUserUpdateResponseidr$   rI   rJ   rW   rX   rY   rZ   r]   r   rL   NrM   r   r   r   r    r_      s   
 r_   z/users/{user_id}rH   	user_datac              
   C   st   z|  }t|| |}|W S  ty     ty9 } ztjdt| dd ttj	dt| dd}~ww )u   
    관리자 권한으로 사용자 정보를 업데이트합니다.
    
    로그인 여부와 관계없이 접근 가능합니다.
    zFailed to update user: Tr)   u@   사용자 정보 업데이트 중 오류가 발생했습니다: r+   N)
dictr   update_user_by_adminr   r0   r.   r1   r   r   r2   )rH   ra   r"   Zuser_data_dictZupdated_userr4   r   r   r    rc      s   rc   z!/product-categories/{category_id}category_idc              
   C   sj   z	t || }|W S  ty     ty4 } ztjdt| dd ttjdt| dd}~ww )ui  
    관리자 권한으로 상품 카테고리를 삭제하는 엔드포인트입니다.
    
    로그인 여부와 관계없이 접근 가능합니다.
    
    제약 조건:
    - 카테고리에 속한 제품이 있는 경우 삭제할 수 없습니다.
    - 관련 제품을 먼저 제거하거나 다른 카테고리로 재할당해야 합니다.
    z!Error deleting product category: Tr)   u=   상품 카테고리 삭제 중 오류가 발생했습니다: r+   N)	r   delete_product_categoryr   r0   r.   r1   r   r   r2   )rd   r"   r3   r4   r   r   r     delete_product_category_endpoint   s   rf   z/ordersu   건너뛸 레코드 수d   u   최대 조회 레코드 수skiplimitc                 C   s   t || |S )u0  
    관리자용 모든 사용자의 주문정보를 조회합니다.
    
    Args:
        skip (int): 건너뛸 레코드 수
        limit (int): 조회할 최대 레코드 수
        db (Session): 데이터베이스 세션
        
    Returns:
        List[Dict]: 모든 주문 정보 목록
    )r   get_all_orders)rh   ri   r"   r   r   r    get_all_orders_endpoint   s   rk   c                   @   s"   e Zd ZU edddZeed< dS )OrderStatusUpdate.u9   주문 상태 (DELIVERED, PROCESSING, PENDING, CANCELLED)r7   r   N)r   r   r   r   r   r   r   r   r   r   r    rl      s   
 rl   z/orders/{order_id}/statusorder_idstatus_updatec                 C   s   t || |jS )u7  
    주문 상태를 업데이트합니다.
    
    Args:
        order_id (int): 업데이트할 주문 ID
        status_update (OrderStatusUpdate): 업데이트할 상태 정보
        db (Session): 데이터베이스 세션
        
    Returns:
        Dict[str, Any]: 업데이트된 주문 정보
    )r   update_order_statusr   )rm   rn   r"   r   r   r    update_order_status_endpoint   s   rp   c                   @   sN   e Zd ZU edddZeed< eddddZeed< edd	d
dZ	eed< dS )AdvertisementRequest.u
   광고 URLr7   ad_urlu   광고 비디오 나열 순서r^   )r8   r[   video_list_orderu2   광고 비디오 시청 시 지급되는 포인트r   ad_video_pointsN)
r   r   r   r   rr   r   r   rs   rN   rt   r   r   r   r    rq     s   
 rq   z/advertisementsad_datac                 C   s   t ||  S )u  
    새로운 광고를 추가합니다.
    
    Args:
        ad_data (AdvertisementRequest): 광고 정보 (ad_url, video_list_order, ad_video_points)
        db (Session): 데이터베이스 세션
        
    Returns:
        Dict[str, Any]: 생성된 광고 정보
    )r   create_advertisementrb   )ru   r"   r   r   r    create_advertisement_endpoint  s   rw   z/advertisements/{ad_id}ad_idc                 C   r;   )u   
    광고를 삭제합니다.
    
    Args:
        ad_id (int): 삭제할 광고 ID
        db (Session): 데이터베이스 세션
        
    Returns:
        Dict[str, Any]: 삭제 결과 메시지
    )r   delete_advertisement)rx   r"   r   r   r    delete_advertisement_endpoint*  s   rz   )7fastapir   r   r   r   r   typingr   r   r	   r
   sqlalchemy.ormr   pydanticr   r   r   r   Zapp.api.depsr   r   r   app.models.userr   app.servicesr   app.schemas.admin_settingr   r   r.   routerr   postr5   getr   r<   r>   putrC   rF   rG   rO   rQ   r_   rN   rc   deleterf   rk   rl   rp   rq   rw   rz   r   r   r   r    <module>   s    *




