o
    լi8                  	   @   s*  d Z ddlmZmZ ddlmZ ddlmZmZ ddl	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 ed	d
gdZeddefddZeddefddZeddefddZeddefddZed		d#dedee dee fddZed d!d" Z dS )$u*  
==============================================================================
Goalskill 라우터 - 분류 알고리즘 API 엔드포인트
==============================================================================
테스트/디버그 및 외부 파트에서도 HTTP로 호출 가능한 API.
    )	APIRouterHTTPException)	BaseModel)LiteralOptional)classify_and_saveclassify_only)get_from_goalskill_tableget_all_goalskill_dataget_talk_countVALID_TABLES)logger)ClassifyAndSaveRequestClassifyOnlyRequestTableQueryRequestz
/goalskillzGoalskill Classifier)prefixtagsz/classify-saverequestc              
      s`   zt | j| j| j| jdI dH }|W S  ty/ } ztd|  tdt	|dd}~ww )u   
    INPUT 데이터를 분류하고 Goalskill_DB에 저장.

    - sender, part는 호출 시 전달
    - H/S, T/P/R은 알고리즘이 자동 판단
    )
session_idsenderparttextNz%[Goalskill API] classify-save error:   status_codedetail)
r   r   r   r   r   	Exceptionr   errorr   strr   resulte r"   :/home/air/goalskill_t/back/app/routers/goalskill_router.pyapi_classify_and_save   s   r$   z/classify-onlyc              
      sV   zt | j| j| jd}|W S  ty* } ztd|  tdt|dd}~ww )u   
    분류만 수행 (저장하지 않음). 디버그/테스트용.

    어떤 테이블로 분류되는지 확인할 수 있습니다.
    )r   r   r   z%[Goalskill API] classify-only error: r   r   N)	r   r   r   r   r   r   r   r   r   r   r"   r"   r#   api_classify_only2   s   r%   z/queryc              
      s   z'| j tvrtdd| j  dtt dt| j | j}| j | jt||dW S  ty0     tyK } zt	d|  tdt
|dd}~ww )	u<   
    특정 Goalskill_DB 테이블의 데이터 조회.
    i  zInvalid table name: z. Valid tables: r   )
table_namer   countdataz[Goalskill API] query error: r   N)r&   r   r   sortedr	   r   lenr   r   r   r   )r   r(   r!   r"   r"   r#   api_query_tableF   s,   

r+   z/all/{session_id}r   c              
      sV   zt | }| t||dW S  ty* } ztd|  tdt|dd}~ww )u~   
    유저의 모든 Goalskill_DB 데이터 조회 (48 테이블).
    데이터가 있는 테이블만 반환합니다.
    )r   tables_with_datar(   z[Goalskill API] get-all error: r   r   N)r
   r*   r   r   r   r   r   )r   r(   r!   r"   r"   r#   api_get_all_datab   s   r-   z/talk-count/{session_id}N
goal_scoper   c              
      s`   zt | ||}| |pd|pd|dW S  ty/ } ztd|  tdt|dd}~ww )u   
    유저의 대화 횟수 합계 조회.

    Query params:
    - goal_scope: "H" 또는 "S" (생략 시 모두)
    - part: "A"~"D" (생략 시 모두)
    ALL)r   r.   r   
talk_countz"[Goalskill API] talk-count error: r   r   N)r   r   r   r   r   r   )r   r.   r   r'   r!   r"   r"   r#   api_get_talk_countu   s   r1   z/tablesc                     sL   i } t tD ]}|dd }|| vrg | |< | | | qtt| dS )uA   
    유효한 48개 테이블 목록 반환 (디버그용).
    N   )total_tablestables)r)   r   appendr*   )tables_by_grouptabler   r"   r"   r#   api_list_tables   s   r8   )NN)!__doc__fastapir   r   pydanticr   typingr   r   !app.services.goalskill_classifierr   r   app.models.goalskill_moduler	   r
   r   r   app.core.configr   app.schemas.goalskill_schemar   r   r   routerpostr$   r%   r+   getr   r-   r1   r8   r"   r"   r"   r#   <module>   s:    