o
    h&                     @   s   d Z ddlmZmZmZ ddlmZ ddlZedeZ	e
eZe	jddgdd	d
 Ze	jddgddd Ze	jddgddd Ze	jddgddd Ze	jddgddd Ze	jddgddd ZdS )u3   
교량 상태평가 가중치 API 엔드포인트
    )	Blueprintrequestjsonify)create_weight_managerNevaluation_weightsz/save_evaluation_weightsPOST)methodsc               
   C   s*  zjt jstddddfW S t  } d| vr tddddfW S d| vr.tddddfW S | d }| d }g d	}t }|||}|d
 rVtd|  t|dfW S td| d|	d  t|dfW S  t
y } ztdt|  tddt| ddfW  Y d}~S d}~ww )u&  
    교량별 평가 가중치 저장 API
    
    Request Body:
    {
        "filename": "bridge_name.xlsx",
        "weights": {
            "slab": 25,
            "girder": 20,
            "crossbeam": 15,
            ...
        }
    }
    
    Returns:
        JSON: 저장 결과
    F4   Content-Type이 application/json이어야 합니다.successerror  filenameu   filename이 필요합니다.weightsu   weights가 필요합니다.slabgirder	crossbeampavementdrainagerailingexpansionJointbearingabutmentpier
foundationcarbonation_uppercarbonation_lowerr   u%   가중치 저장 성공 - 파일명:    u%   가중치 저장 실패 - 파일명: 
   , 오류: r     u   가중치 저장 API 오류: ,   서버 내부 오류가 발생했습니다: N)r   is_jsonr   get_jsonr   save_weightsloggerinfor   get	Exceptionstr)datar   r   required_weight_fieldsweight_managerresulte r/   E/home/skpark/git/infrasmart_work/infrasmart/api/evaluation_weights.pysave_evaluation_weights   sV   r1   z/load_evaluation_weightsGETc               
   C   s   z<t jd} | stddddfW S t }|| }|d r.td|   t|dfW S td	|   t|dfW S  tyf } zt	d
t
|  tddt
| ddfW  Y d}~S d}~ww )u   
    교량별 평가 가중치 불러오기 API
    
    Query Parameters:
        filename (str): 교량 파일명
    
    Returns:
        JSON: 가중치 데이터
    r   F)   filename 파라미터가 필요합니다.r
   r   r   u+   가중치 불러오기 성공 - 파일명: r   u(   저장된 가중치 없음 - 파일명: u#   가중치 불러오기 API 오류: r!   r    N)r   argsr'   r   r   load_weightsr%   r&   r(   r   r)   r   r,   r-   r.   r/   r/   r0   load_evaluation_weightsU   s4   
r7   z/get_default_weightsc               
   C   s   z"t jdd} t }|| }td|   td|| ddfW S  tyL } zt	dt
|  tdd	t
| d
dfW  Y d}~S d}~ww )u   
    구조형식별 기본 가중치 반환 API
    
    Query Parameters:
        structure_type (str, optional): 구조형식 (기본값: "일반")
    
    Returns:
        JSON: 기본 가중치 데이터
    structure_typeu   일반u/   기본 가중치 조회 성공 - 구조형식: T)r   r   r8   r   u$   기본 가중치 조회 API 오류: Fr!   r
   r    N)r   r4   r'   r   get_default_weightsr%   r&   r   r(   r   r)   )r8   r,   default_weightsr.   r/   r/   r0   r9   ~   s,   
r9   z/delete_evaluation_weightsDELETEc               
   C   s   zBt jd} | stddddfW S t }|| }|d r.td|   t|dfW S td	|  d
|d  t|dfW S  t	yl } zt
dt|  tddt| ddfW  Y d}~S d}~ww )u   
    교량별 평가 가중치 삭제 API
    
    Query Parameters:
        filename (str): 교량 파일명
    
    Returns:
        JSON: 삭제 결과
    r   Fr3   r
   r   r   u%   가중치 삭제 성공 - 파일명: r   u%   가중치 삭제 실패 - 파일명: r   r   i  u   가중치 삭제 API 오류: r!   r    N)r   r4   r'   r   r   delete_weightsr%   r&   warningr(   r   r)   r6   r/   r/   r0   delete_evaluation_weights   s4   
r>   z/list_evaluation_weightsc               
   C   s   z&t  } | d rtd t| dfW S td| d  t| dfW S  tyP } ztdt|  tdd	t| d
dfW  Y d}~S d}~ww )un   
    모든 교량의 평가 가중치 목록 조회 API
    
    Returns:
        JSON: 가중치 목록
    r   u   가중치 목록 조회 성공r   u    가중치 목록 조회 실패: r   r    u$   가중치 목록 조회 API 오류: Fr!   r
   N)	r,   list_all_weightsr%   r&   r   r   r'   r(   r)   )r-   r.   r/   r/   r0   list_evaluation_weights   s"   
r@   z/validate_weightsc               
      s  zt jstddddfW S t  } | di  g }d}g d}|D ]?} |d}z$t|}|dk r<|| d n|d	krI|| d
 n||7 }W q" ttfya   || d Y q"w g d}t	 fdd|D }t
|d	 dkr|dkr|d| d t|dk|||d}	td|	d rdnd  t|	dfW S  ty }
 ztdt|
  tddt|
 ddfW  Y d}
~
S d}
~
ww )u   
    가중치 데이터 유효성 검사 API
    
    Request Body:
    {
        "weights": {
            "slab": 25,
            "girder": 20,
            ...
        }
    }
    
    Returns:
        JSON: 유효성 검사 결과
    Fr	   r
   r   r   r   r   u+   : 가중치는 0 이상이어야 합니다.d   u*   : 가중치는 100 이하여야 합니다.u#   : 유효한 숫자여야 합니다.)r   r   r   r   r   r   r   r   c                 3   s,    | ]}  |d rt  |d V  qdS )r   N)r'   float).0fieldr   r/   r0   	<genexpr>  s   * z#validate_weights.<locals>.<genexpr>g{Gz?u@   상부구조 가중치 합계가 100%가 아닙니다. (현재: z%))r   total_weightsuperstructure_weighterrorsu%   가중치 유효성 검사 - 결과: r   u   성공u   실패r   u'   가중치 유효성 검사 API 오류: r!   r    N)r   r"   r   r#   r'   rB   append
ValueError	TypeErrorsumabslenr%   r&   r(   r   r)   )r*   validation_errorsrG   required_fieldsrD   valuefloat_valuesuperstructure_fieldssuperstructure_totalr-   r.   r/   rE   r0   validate_weights   s^   
rV   )__doc__flaskr   r   r   utils.evaluation_weightsr   logging__name__evaluation_weights_bp	getLoggerr%   router1   r7   r9   r>   r@   rV   r/   r/   r/   r0   <module>   s$    


F
(
!
&
