o
    ,iL                     @   sZ  d Z ddlZddlZddlmZmZmZmZm	Z	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mZmZmZ ddlmZ dd	lmZ d
dlmZ edejdddgdedd Zededd Z eddd Z!eddd Z"eddd Z#edd d! Z$ed"ed#d$ Z%ejd%ddgded&d' Z&dS )(u   
메인 페이지 라우트
    N)requestrender_templateredirecturl_forsessionflashsend_from_directoryjsonify)secure_filename)clean_excel_header_newlines)get_db_connectionclean_dataframe_data)validate_excel_fileexcel_to_clean_dfperform_detailed_validation)login_required)check_and_use_upload_count   )main_bp/z/indexGETPOST)methodsc            1         s  dt vrtd ttdS 	 tjdkrdtjv rtjd } | jdkr/tdd ttjS | r| j	d	rt 
dpBt 
d
}ddlm}m} ddlm}m} ||}||}|s}|s}||}||}	d}
td| d|	 d|
 dd ttjS zt| }t|| }t|drd|j}td| d ttjW S |\}}t|}t|}|
drt|d }g }|d d d D ]}|d }d|d }|d| d|  q|dkr|d|d  d td| d d| d ttjW S |
d!g }|std"d ttjW S t }| }dd l}dd l fd#d$  |}|j|d%d&}tj
d'd}tj
d(d}tj
d)d}tj
d*d}tj
d+d}tj
d,d}z|ret |nd }|rnt!|nd }|rwt!|nd }W n t"t#fy   d }d }d }Y nw d-t$|v r|%d.|f n|%d/|f |& } | r| d r| d nd0}!|%d1 |& d u}"|"r|%d2t d t$t'( | j||||||||!f n|%d3t d t$t'( | j|||||||f
 d-t$|v r|%d4|f n|%d5|f |& }#|#ro|#d d ur|#d nd}$|#d6 d ur(|#d6 nd}%|$dkr6t)d|$d6 n|$}&|%dkrDt)d|%d6 n|%}'d-t$|v rW|%d7|&|'|f n	|%d8|&|'|f d9|& d:|' d;}(t|(d< ntd=d> |*  |+  |+  ttd?W S  t,y }) zId@t- v rz|.  W n   Y zdAt- v r|+  |+  W n   Y dd l/}*|*j0dB|) dCdD tdEt$|) d ttjW  Y d })~)S d })~)ww tdFd ttjS t }| }t 
d}|%d/|f |& }+|+r
|+d r
|+d nd0},|%dG dHdI |1 D }-dJ|-v }"|"sNz|%dK |*  |-dJ dC}"W n t,yM }) zt2dL|)  W Y d })~)nd })~)ww |%dMd|- dN|f g }.|1 D ]}/t3t4|-|/}0|0
dJsud0|0dJ< |.|0 qb|+  |+  t5dO|.dPS )QNuser_idu   로그인이 필요합니다.z
auth.loginr   file u'   파일이 선택되지 않았습니다.errorz.xlsxemailr   )can_upload_fileget_upload_count)can_use_pro_trialget_pro_trial_countz+https://infrasmart.co.kr/order.php?plan=proun   파일 업로드 횟수와 Pro 무료체험 횟수가 모두 소진되었습니다. (남은 업로드 횟수: u   회, 남은 Pro 횟수: u)   회)<br>추가 사용을 위해 <a href="uk   " target="_blank" style="color: #007bff; text-decoration: underline;">Pro 플랜을 구독</a>해주세요.is_validz<br>u   파일 검증 실패:<br>
error_rows
   	row_indexz, errorsu   행 z: u   ... 외 u
   개 오류u   파일 검증 실패 (총 u   개 오류):<br>cleaned_datau$   유효한 데이터가 없습니다.c                    sf   t | tr| s| rdS | S t | tr# fdd|  D S t | tr1 fdd| D S | S )u$   NaN과 Infinity를 None으로 변환Nc                    s   i | ]	\}}| |qS  r(   ).0kvconvert_nan_to_noner(   E/home/skpark/git/infrasmart_work/infrasmart/blueprints/main/routes.py
<dictcomp>y   s    z6index.<locals>.convert_nan_to_none.<locals>.<dictcomp>c                    s   g | ]} |qS r(   r(   )r)   itemr,   r(   r.   
<listcomp>{       z6index.<locals>.convert_nan_to_none.<locals>.<listcomp>)
isinstancefloatisnanisinfdictitemslist)objr-   mathr(   r.   r-   s   s   


z"index.<locals>.convert_nan_to_noneF)ensure_asciibridge_namestructure_type
span_countlengthwidthexpansion_joint_location@z'SELECT plan FROM users WHERE email = %sz$SELECT plan FROM users WHERE id = %sfreez
                        SELECT column_name
                        FROM information_schema.columns
                        WHERE table_name = 'uploaded_files' AND column_name = 'plan_type'
                    a  
                            INSERT INTO uploaded_files
                            (user_id, filename, original_filename, file_data, bridge_name,
                             structure_type, span_count, length, width, expansion_joint_location, plan_type)
                            VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
                            ON CONFLICT (user_id, filename)
                            DO UPDATE SET file_data = EXCLUDED.file_data, bridge_name = EXCLUDED.bridge_name,
                                         structure_type = EXCLUDED.structure_type, span_count = EXCLUDED.span_count,
                                         length = EXCLUDED.length, width = EXCLUDED.width,
                                         expansion_joint_location = EXCLUDED.expansion_joint_location,
                                         plan_type = EXCLUDED.plan_type
                            a=  
                            INSERT INTO uploaded_files
                            (user_id, filename, original_filename, file_data, bridge_name,
                             structure_type, span_count, length, width, expansion_joint_location)
                            VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
                            ON CONFLICT (user_id, filename)
                            DO UPDATE SET file_data = EXCLUDED.file_data, bridge_name = EXCLUDED.bridge_name,
                                         structure_type = EXCLUDED.structure_type, span_count = EXCLUDED.span_count,
                                         length = EXCLUDED.length, width = EXCLUDED.width,
                                         expansion_joint_location = EXCLUDED.expansion_joint_location
                            z@SELECT upload_count, pro_trial_count FROM users WHERE email = %sz=SELECT upload_count, pro_trial_count FROM users WHERE id = %sr   zIUPDATE users SET upload_count = %s, pro_trial_count = %s WHERE email = %szFUPDATE users SET upload_count = %s, pro_trial_count = %s WHERE id = %suN   파일이 성공적으로 업로드되었습니다. (남은 업로드 횟수: u%   회, 남은 Pro 무료체험 횟수: u   회)successuL   파일이 업로드되었지만 사용자 정보를 찾을 수 없습니다.warningz
main.indexconncuru   파일 처리 오류: T)exc_infou0   파일 처리 중 오류가 발생했습니다: u7   올바른 Excel 파일(.xlsx)을 업로드해주세요.zt
        SELECT column_name
        FROM information_schema.columns
        WHERE table_name = 'uploaded_files'
    c                 S   s   g | ]}|d  qS )r   r(   )r)   rowr(   r(   r.   r1   (  r2   zindex.<locals>.<listcomp>	plan_typez
                ALTER TABLE uploaded_files 
                ADD COLUMN IF NOT EXISTS plan_type VARCHAR(10) DEFAULT NULL
            u    plan_type 컬럼 추가 실패: z
        SELECT z^
        FROM uploaded_files
        WHERE user_id = %s
        ORDER BY upload_date DESC
    z
files.html)files)6r   r   r   r   r   methodrM   filenameurlendswithgetutils.upload_countr   r   utils.pro_trialr    r!   r   r   hasattrjoinr&   r   r   lenappendr   cursorjsonr<   dumpsformintr4   
ValueError	TypeErrorstrexecutefetchoneuuiduuid4maxcommitclose	Exceptionlocalsrollbackloggingr   fetchallprintr7   zipr   )1r   r   r   r   r    r!   has_upload_counthas_pro_trialupload_remainingpro_remainingpurchase_urlcleaned_file	df_resulterror_messagesdf
header_rowvalidation_resulterror_count	error_rowrow_numr&   r'   rH   rI   rZ   	file_datar>   r?   r@   rA   rB   rC   plan_result	user_planhas_plan_typecount_resultupload_countpro_trial_countnew_upload_countnew_pro_trial_countmessageerk   user_plan_resultcurrent_plancolumnsrM   rK   	file_dictr(   r;   r.   index   sz  


















r   z	/index_rec               	   C   s   ddl m}  t }| }|dtd f | }g }|D ]'}||d |d |d |d dur5|d nd|d	 dur@|d	 ndd
 qddgddddgddddddgidg diddgid}| ||}|  t	d|dS )u   새로운 인덱스 페이지r   )process_slab_damage_datau
  
        SELECT 부재명, 손상내용, 단위, SUM(손상물량) as 총손상물량, SUM(개소) as 총개소
        FROM file_damage_details
        WHERE user_id = %s
        GROUP BY 부재명, 손상내용, 단위
        ORDER BY 부재명, 손상내용
    r   r         N   )u	   부재명u   손상내용u   단위u   손상물량u   개소u   균열부백태   균열g      ?)keywordslength_factoru   망상균열)u   1방향u   2방향r      누수u   백태)u   박리u   박락u   파손u   철근노출)r   r   u   표면손상u   철근부식zindex_re.html)	slab_data)
utils.slab_processingr   r   rY   ra   r   rl   rX   rg   r   )r   rH   rY   component_dataprocessed_datarK   custom_damage_mappingr   r(   r(   r.   index_reQ  sB   

r   z/favicon.icoc                   C   
   t ddS )Nstaticzfavicon.icor   r(   r(   r(   r.   favicon     
r   z
/style.cssc                   C   r   )Nz
static/cssz	style.cssr   r(   r(   r(   r.   style  r   r   z/js/<path:filename>c                 C   s
   t d| S )Nz	static/jsr   rO   r(   r(   r.   serve_js  r   r   z/download/<filename>c                 C   s   t d| ddS )u   파일 다운로드dataT)as_attachmentr   r   r(   r(   r.   download_file  s   r   z/pricingc                   C   s   t dS )u   가격 정책 페이지zpricing.html)r   r(   r(   r(   r.   pricing  s   r   z/files/delete_file/<filename>c                 C   sF   t  }| }|dtd | f |  |  |  tddiS )u   파일 삭제 및 JSON 응답z?DELETE FROM uploaded_files WHERE user_id = %s AND filename = %sr   rF   T)r   rY   ra   r   rf   rg   r	   )rO   rH   rI   r(   r(   r.   delete_file  s   
r   )'__doc__pandaspdrc   flaskr   r   r   r   r   r   r   r	   werkzeug.utilsr
   api.filer   utils.commonr   r   utils.file_validationr   r   r   utils.decoratorsr   rS   r   r   r   router   r   r   r   r   r   r   r   r(   r(   r(   r.   <module>   sD    (  @;



