
    	iX                         d Z ddlmZ ddlmZmZmZmZmZ ddl	m
Z
 ddlmZmZ ddlmZ ddefd	Zdd
ededefdZd ZdededededededefdZdS )u[   
학습계획표 엑셀 파일 생성
BASE 엑셀 템플릿 생성 및 데이터 채우기
    )Workbook)Font	AlignmentPatternFillBorderSideget_column_letter)PageMarginsPrintPageSetup)PathNoutput_pathc                    | =t          t                                                    j        j        j        }|dz  dz  } t          |           j                            dd           t                      }|j        }d|_        t          dddd	
          }t          dddd	
          }t          dd          }t          ddd          }t          ddd          }t          ddd          }	t          ddd          }
t          t          d          t          d          t          d          t          d                    }|                    d           d|d<   ||d         _        ||d         _        t          dd          |d         _        d|j        d         _        d|d<   ||d         _        ||d         _        t          dd          |d         _        |                    d            d!|j        d"         _        g d#}d$}|D ]\  }}}|d%z   ||<   t          ddd&          ||         _        |||         _        t          dd          ||         _        |||         _        d'||<   |||         _        |||         _        t          dd          ||         _        |||         _        d(| }d'||<   |||         _        |||         _        d)|j        |         _        |dz  }d*|d+<   ||d+         _        ||d+         _        t          dd          |d+         _        |                    d,           d!|j        d-         _        d.|d/<   t          dd-dd01          |d/         _        |                    d2           d|j        d         _        g d3}g d4}t)          ||          D ]B\  }}|| d5         }||_        ||_        ||_        t          dd          |_        ||_        Cd!|j        d         _        g d6}t-          |d78          D ]e\  }}||d9| <   ||d9|          _        |dk     r|	n|
|d9|          _        t          dd          |d9|          _        ||d9|          _        d'|d:| <   ||d:|          _        |dk     r|	n|
|d:|          _        t          dd          |d:|          _        ||d:|          _        d'|d;| <   ||d;|          _        |dk     r|	n|
|d;|          _        t          dd          |d;|          _        ||d;|          _        d'|d(| <   |dk     r|	n|
|d(|          _        ||d(|          _        d)|j        |         _        gd<|j        d9         _        d<|j        d:         _        d=|j        d;         _        d>|j        d(         _        t3          d?d?d?d?d@d@A          |_        t7          dBdCddD          |_        d|j        _        d|j        _        dE|_        g |_         	 |!                    dFdG           tE          dH           n)# tF          $ r}tE          dI|            Y d}~nd}~ww xY w	 |$                    d>dF           tE          dJ           n)# tF          $ r}tE          dK|            Y d}~nd}~ww xY wdE|_        t7          dBdCddD          |_        d|j        _        d|j        _        t3          d?d?d?d?d@d@A          |_        g |_         tE          dL|j%         dM|j&         dN|j                    |'                    |            dOdPl(m)}  ||           }|j        }tE          dQ|j%         dM|j&         dN|j                    |*                                 tW          |           S )Ru   
    BASE 엑셀 템플릿 생성
    
    Args:
        output_path: 저장할 경로 (없으면 기본 경로)
    
    Returns:
        엑셀 파일 경로
    Nstudyplan_fileszbase_studyplan_template.xlsxT)parentsexist_oku   学習計画表u   メイリオ   FFFFFF)namesizeboldcolor      )r   r   4472C4solid)start_color	end_color	fill_typeD9E1F2E7F3FFFFF2CCthin)style)leftrighttopbottomzA1:D1A1center)
horizontalvertical      u   【基本情報】A3r%   zA3:D3      ))u   目標期間B4C4)u   現在の状態B5C5)u   平日学習時間B6C6)u   週末学習時間B7C7)u   希望時間帯B8C8   :)r   r   r    D   u   【週間スケジュール】A10zA10:D10
   u8   (このパターンを目標期間中繰り返します)A11666666)r   r   italicr   zA11:D11)u   曜日u   学習時間u	   時間帯)ABC12u	   月曜日u	   火曜日u	   水曜日u	   木曜日u	   金曜日u	   土曜日u	   日曜日   startrF   rG   rH      #      g      ?g333333?)r%   r&   r'   r(   headerfooter	landscape	   orientation	paperSizefitToHeight
fitToWidthA1:D19   d   z?BASE Template: Force deleted rows 20-120 to clear ghost stylingz-BASE Template: Could not delete rows 20-120: z<BASE Template: Force deleted cols E-X to clear ghost stylingz*BASE Template: Could not delete cols E-X: z$BASE Template before save - max_row=, max_column=z, print_area=r   load_workbookz.BASE Template after save and reload - max_row=),r   __file__resolveparentmkdirr   activetitler   r   r   r   merge_cellsfontfillr   	alignmentrow_dimensionsheightborderzipvalue	enumeratecolumn_dimensionswidthr   page_marginsr   
page_setuphorizontalCenteredverticalCentered
print_areapage_breaksdelete_rowsprint	Exceptiondelete_colsmax_row
max_columnsaveopenpyxlr_   closestr)r   base_dirwbws
title_fontheader_fontnormal_fontheader_fill	info_fillweekday_fillweekend_fillthin_border
info_itemsrowlabel
label_cell
value_celld_cellheadersheader_colscolrQ   cellweekdaysidxdayer_   wb_checkws_checks                                 ./app/app/services/studyplan_excel_generator.pycreate_base_excel_templater      s	    >>))++29@!225SS 	""4$"??? 
B	B BH >XNNNJN$hOOOKN444K(hRYZZZKHPWXXXI8xSZ[[[L8xSZ[[[L   v&!!!	  K NN7 BtHBtHMBtHM"hJJJBtH"$Ba $BtHBtHMBtHM"fxHHHBtHNN7"$Ba  J C)3  %z::"RdKKK:':#,#R#R#R:  +: :):':#,#R#R#R:  +: S6
#6
'6
(*#%q 1BuI BuIN BuIN#vIIIBuINN9#%Bb JBuI~Bt8TTTBuINNN9#%Bb  655G!//K;00 " "VS***~
		"hJJJ!#%Bb  kjjHhb111 + +S9s99(9s99-02XX\\<9s99"+v"Q"Q"Q9s99*9s99 9s99(9s99-02XX\\<9s99"+x("S"S"S9s99*9s99 9s99(9s99-02XX\\<9s99"+v"Q"Q"Q9s99*9s99 9s99-02XX\\<9s99*9s99(*#%% ')B#&(B#&(B#&'B# "  BO #	  BM (,BM$%)BM" BM BNC
r3OPPPP C C CAaAABBBBBBBBC
@
q"LMMMM @ @ @>1>>????????@ BM #	  BM (,BM$%)BM" "s#3sSV_bcccBO BN 

u
u
u"-
u
ufhfs
u
uvvv GGK '&&&&&}[))HH	  R8;K  R  RZbZm  R  R  }E  }P  R  R  S  S  SNN{s0   6%Y 
Z&Y==Z%Z, ,
[6[[time_slot_texthoursreturnc           
         |                                                                  }ddddddddd}d	}|                                D ]\  }}|| v r|} n|rZ|Xt          t          |                    d
                    \  }}|dz  |z   }	|	|dz  z   }
|
dz  dz  }|
dz  }|dd
|d}| d| S dddddddddd	}|                                D ]\  }}|| v r|c S d| v sd| v sd
| v r|                     dd          } | S | S )u  
    시간대 텍스트를 시간 범위 형식으로 변환
    학습 시간(hours)이 주어지면 시작 시간부터 해당 시간만큼 계산
    
    Args:
        time_slot_text: 시간대 텍스트 (예: "夕方")
        hours: 학습 시간 (예: 1, 3) - None이면 기본 범위 반환
    
    Returns:
        시간 범위 (예: "17:00~18:00" 또는 "17:00~20:00")
    z06:00z09:00z12:00z14:00z17:00z19:00z22:00)   朝   午前   昼   午後   夕方   夜間   深夜   夜間/深夜Nr=   <      02d~z06:00~09:00z09:00~12:00z12:00~14:00z14:00~17:00z17:00~19:00z19:00~22:00z22:00~02:00z19:00~02:00)	r   r   r   r   r   r   r   r   u    夜間/深夜（19:00〜02:00）u   〜)lowerstripitemsmapintsplitreplace)r   r   time_slot_lowertime_slot_start_map
start_timekeyrn   
start_hour	start_minstart_minutesend_minutesend_hourend_minend_timetime_slot_maps                  r   _convert_time_slot_to_ranger     s    %**,,2244O  	 	 J)//11  
U.  JE !
  *e' #C)9)9#)>)> ? ?
I"R)3 $urz22%+"222W222))x))) &,9
 
M $))++  
U.  LLL ! n 7 73.;P;P'//s;;     c                 J   ddl m} ddlm}m} 	  ||          \  }} ||          }| j        j        D ]U}|j        |cxk    r|j        k    r<n |j	        |cxk    r|j
        k    r"n 6 ||j	                  }	|j        }
|	 |
 c S Vn# t          $ r
}Y d}~nd}~ww xY w|S )uz   
    병합된 셀인 경우 병합의 시작 셀 좌표를 반환
    병합되지 않은 셀이면 그대로 반환
    r   r	   coordinate_from_stringcolumn_index_from_stringN)openpyxl.utilsr
   openpyxl.utils.cellr   r   merged_cellsrangesmin_rowr|   min_colmax_colrz   )r   cell_coordinater
   r   r   r   r   col_idxmerged_range	start_col	start_rowr   s               r   _get_merged_cell_startr   L  s)   
 100000TTTTTTTT))/::S**3// O2 	1 	1L$CCCC|/CCCCCC$GGGG<3GGGGGG--l.BCC	(0	#0Y00000	1    
 s   A9B 
B 
B B 
excel_pathtotal_durationcurrent_statusweekday_hoursweekend_hourspreferred_time_slotc                    ddl m}  ||           }|j        fd}|}	ddlm}
 |
                    d           |
                    d| dt          |           d| dt          |           d		           |
                    d
| d|            |
                    d|	 d           |
                    d           	 t          d          } |||           |
                    d| d|            n+# t          $ r}|
	                    d|             d}~ww xY w	 t          d          } |||           |
                    d| d|            n+# t          $ r}|
	                    d|             d}~ww xY w	 t          d          } ||| d           |
                    d| d| d           n+# t          $ r}|
	                    d|             d}~ww xY w	 t          d          } ||| d           |
                    d| d| d           n+# t          $ r}|
	                    d|             d}~ww xY w	 t          d          } |||	           |
                    d| d|	            n+# t          $ r}|
	                    d |             d}~ww xY wg d!}t          |d"#          D ]\  }}d$| }d%| }	 |d&k     rN ||| d           t          ||          } |||           |
                    d| d'| d(| d'| d)	           nM ||| d           t          ||          } |||           |
                    d| d'| d(| d'| d*	           # t          $ r$}|
	                    d+| d,| d'|             d}~ww xY w	                     d-d.           |
                    d/           n/# t          $ r"}|
                    d0|            Y d}~nd}~ww xY w	                     d1d-           |
                    d2           n/# t          $ r"}|
                    d3|            Y d}~nd}~ww xY wd4_        t!          d5d6d7d78          _        g _        |
                    d9           |
                    d:j         d;j                    |
                    d<j                    |
                    d=j        j         d>j        j                    |
                    d?j        j                    |
                    d@t1          j                              |                    |            |
                    dA|             ddl m}  ||           }|j        }|
                    dB           |
                    d:|j         d;|j                    |
                    d<|j                    |
                    d=|j        j         d>|j        j                    |
                    dC           |                                 | S )Duy  
    BASE 엑셀 템플릿에 데이터 채우기
    
    Args:
        excel_path: 엑셀 파일 경로
        total_duration: 목표 기간
        current_status: 현재 상태
        weekday_hours: 평일 학습 시간
        weekend_hours: 주말 학습 시간
        preferred_time_slot: 선호 시간대
    
    Returns:
        채워진 엑셀 파일 경로
    r   r^   c           	         ddl m}m} ddlm} 	 t          |           }g } ||          \  }} ||          }	t          j        j                  D ]z}
|
j	        |cxk    r|
j
        k    ran |
j        |	cxk    r|
j        k    rGn 6|                    t          |
                                         t          |
                     {||<   |                    d| d| d|  d           |D ]}                    |           dS # t$          $ r}|                    d|  d	| d
           	 t          |           }||<   |                    d| d|            n[# t$          $ rN}|                    d|  d	|            	 ||          _        n#  t%          d|  d	|           xY wY d}~nd}~ww xY wY d}~dS Y d}~dS d}~ww xY w)u2   병합된 셀도 안전하게 값을 쓰는 함수r   r   loggerzSuccessfully wrote z to z (original: )zError writing to : z, trying direct writezDirect write succeeded: zFailed to write to zCannot write to N)r   r   r   app.core.configr   r   listr   r   r   r|   r   r   appendr   unmerge_cellsdebugrf   rz   warningerrorrn   )
cell_coordrn   r   r   r   
start_cellmerged_ranges_to_restorer   r   r   r   merged_range_strr   e2r   s                 r   safe_write_cellz-fill_excel_with_data.<locals>.safe_write_cell  s   XXXXXXXX******)	K/J??J (*$--j99HC..s33G !%R_%; < < 8 8 (CGGGG<3GGGGGG (GKKKK|7KKKKKK,33C4E4EFFF$$S%6%6777 #BzNLL_u__*__R\___``` %= 1 1 /00001 1  	K 	K 	KNNUzUUQUUUVVVK3B
CC
!&:OOO:OOPPPP K K KE:EEEEFFFK+0BzN((K#$Iz$I$IR$I$IJJJ )((((	K QPPPPP
 )(((((	KsZ   C=D 
GG70E('G(
G 2F;FF;F33F;6G;G  GGr   z=== Filling Excel ===zReceived values: weekday_hours=z (type: z), weekend_hours=r   z	Duration=z	, Status=zTime slot: z) (will be calculated per weekday/weekend)z====================r2   zWrote z (B4): zError writing B4: Nr4   z (B5): zError writing B5: r6   u   時間z (B6): zError writing B6: r8   z (B7): zError writing B7: r:   z (B8): zError writing B8: rJ   rK   rL   rG   rH   r   r   u   時間, z
 (weekday)z
 (weekend)zError writing z or r[   r\   z0Force deleted rows 20-120 to clear ghost stylingzCould not delete rows 20-120: rP   z-Force deleted cols E-X to clear ghost stylingzCould not delete cols E-X: rZ   rS   rT   r.   rU   z#=== Excel File Info Before Save ===zmax_row=r]   zprint_area=zpage_setup.fitToHeight=z, fitToWidth=zpage_setup.orientation=zpage_breaks count=zExcel file saved to: z$=== Excel File Info After Reload ===z%=====================================)r   r_   rd   r   r   infotyper   rz   r   ro   r   rx   r   r{   rv   r   rs   rw   r|   r}   rX   rY   rV   lenr~   r   )r   r   r   r   r   r   r_   r   r   time_slot_for_summaryr   target_cellr   r   r   r   b_cellc_celltime_slot_weekdaytime_slot_weekendr   r   r   s                         @r   fill_excel_with_datar   j  s     '&&&&& 
z	"	"B	B.K .K .K .K .Kd 0 '&&&&&
KK()))
KK  ]-  ]  ]mI\I\  ]  ]o|  ]  ]  GK  LY  GZ  GZ  ]  ]  ]  ^  ^  ^
KKENEE^EEFFF
KK^3^^^___
KK'(((,R66^444A[AAAABBBB   -!--...,R66^444A[AAAABBBB   -!--...,R66%=%=%=>>>F[FFFFFGGGG   -!--...,R66%=%=%=>>>F[FFFFFGGGG   -!--...,R66%:;;;H[HH1FHHIIII   -!--...
 kjjHhb111  SSS	Rxx=(@(@(@AAA$?@SUb$c$c!(9:::mVmm}mmfmmPammmnnnn=(@(@(@AAA$?@SUb$c$c!(9:::mVmm}mmfmmPammmnnn 	 	 	LLC&CCfCCCCDDD	=
r3FGGGG = = =;;;<<<<<<<<=
:
q"CDDDD : : :8Q8899999999: BM #	  BM BN KK6777
KKC2:CCBMCCDDD
KK-bm--...
KKl"-*CllRTR_Rjllmmm
KKE"-*CEEFFF
KK:S%8%8::;;; GGJ
KK4
44555 '&&&&&}Z((HH
KK7888
KKO8+OO(:MOOPPP
KK3h133444
KKx(*=*IxxX`XkXvxxyyy
KK8999NNs   7C: :
D"DD"&7E 
F(FF
;G 
G.G))G.2;H. .
I8II7J 
J:J55J:"B!N
N2N--N26+O" "
P,P		P+P> >
Q*Q%%Q*)N)__doc__r   r   openpyxl.stylesr   r   r   r   r   r   r
   openpyxl.worksheet.pager   r   pathlibr   r   r   r   r   r   r    r   r   <module>r      sV   
       F F F F F F F F F F F F F F , , , , , , ? ? ? ? ? ? ? ?      o oC o o o odH H HC H3 H H H HV  <RS R# Rs R'*R;>RUXR]`R R R R R Rr   