
    }w5it                       d Z ddlmZ ddlZddlmZmZ ddlmZ ddl	m
Z
 ddlmZ ddlZddlmZ  e         G d	 d
ee      Z G d dee      Ze G d d             Ze G d d             Ze G d d             Ze G d d             Zy)z*Configuration management for PlanitAI KPI.    )annotationsN)	dataclassfield)Enum)Path)Any)load_dotenvc                      e Zd ZdZdZdZdZy)NodeTypezKPI node types.kgikpiinputN)__name__
__module____qualname____doc__KGIKPIINPUT     _/var/www/tkim.planitai.co.jp/gemegg/20251207-make-pdf-report/project/planitai-kpi/src/config.pyr   r      s    
C
CEr   r   c                  ,    e Zd ZdZdZdZdZdZdZdZ	dZ
y	)
KPICategoryzKPI categories.financesales	marketinghrproductcustomer	operationN)r   r   r   r   FINANCESALES	MARKETINGHRPRODUCTCUSTOMER	OPERATIONr   r   r   r   r      s(    GEI	BGHIr   r   c                      e Zd ZU dZded<   ded<   ded<   dZded	<   d
Zded<   ej                  Z	ded<    e
e      Zded<   d
Zded<   edd       Zy)KPINodeConfigzKPI node configuration.stridnamer   typeN
str | Noneformula unitr   categorydefault_factory	list[str]childrendescriptionc                   |j                  dd      }t        |t              rt        |j	                               }|j                  dd      }t        |t              rt        |j	                               } | |d   |d   ||j                  d      |j                  dd	      ||j                  d
g       |j                  dd	            S )zCreate from dictionary.r.   r   r3   r   r,   r-   r0   r2   r1   r7   r8   )r,   r-   r.   r0   r2   r3   r7   r8   )get
isinstancer+   r   lowerr   )clsdata	node_typer3   s       r   	from_dictzKPINodeConfig.from_dict2   s     HHVW-	i% !23I88J	2h$"8>>#34HDzfHHY'&"%XXj"-3	
 		
r   )r>   zdict[str, Any]returnr*   )r   r   r   r   __annotations__r0   r2   r   r"   r3   r   listr7   r8   classmethodr@   r   r   r   r*   r*   %   sb    !G
I
NGZD#N'//Hk/5Hi5K
 
r   r*   c                      e Zd ZU dZdZded<   dZded<   dZded	<   d
Zded<   dZ	ded<   dZ
ded<   dZded<   dZded<   dZded<    ee      Zded<   y)PivotConfigz!Pivot table format configuration.Fboolenabled   int
period_row   
header_row   data_start_row   item_coldata_start_colcols_per_periodr   budget_col_offsetactual_col_offsetr4   zdict[str, str]item_mappingN)r   r   r   r   rH   rB   rK   rM   rO   rQ   rR   rS   rT   rU   r   dictrV   r   r   r   rF   rF   I   sp    +GTJJNCHcNCOSss#(#>L.>r   rF   c                  ^    e Zd ZU dZded<   ded<   dZded<   dZded	<    ee
      Z	ded<   y)SheetConfigzGoogle Sheets configuration.r+   sheet_id
data_rangeNr/   target_rangeperiodperiod_columnr4   rF   pivot)
r   r   r   r   rB   r\   r^   r   rF   r_   r   r   r   rY   rY   Y   s2    &MO#L*#!M3!{;E;;r   rY   c                  v    e Zd ZU dZded<   ded<   ded<   dZded	<   d
Zded<   dZded<   edd       Z	dddZ
y)ConfigzMain configuration.rY   sheetzlist[KPINodeConfig]treer+   gemini_api_key./outputoutput_pathjalanguagecredentials.jsoncredentials_pathc                t   t        |      }t        |d      5 }t        j                  |      }ddd       j	                  dd      }|j                  d      r6|j                  d      r%|dd	 }t        j                  j	                  |d      }|j	                  d
i       }|j	                  di       }t        |j	                  dd      |j	                  dd      |j	                  dd      |j	                  dd      |j	                  dd      |j	                  dd      |j	                  dd      |j	                  dd      |j	                  dd      |j	                  di       
      }t        |j	                  dd      |j	                  dd      |j	                  d      |j	                  d d!      |"      }	|j	                  d#g       D 
cg c]  }
t        j                  |
       }}
 | |	|||j	                  d$d%      |j	                  d&d'      |j	                  d(d)      *      S # 1 sw Y   xY wc c}
w )+z"Load configuration from YAML file.zutf-8)encodingNrd   r1   z${}   rb   r_   rH   FrK   rI   rM   rL   rO   rN   rQ   rP   rR   rS   rT   r   rU   rV   )
rH   rK   rM   rO   rQ   rR   rS   rT   rU   rV   rZ   r[   r\   r^   r]   )rZ   r[   r\   r^   r_   rc   rf   re   rh   rg   rj   ri   )rb   rc   rd   rf   rh   rj   )r   openyaml	safe_loadr:   
startswithendswithosenvironrF   rY   r*   r@   )r=   pathfr>   rd   env_var
sheet_data
pivot_datapivot_configsheet_confignode
tree_nodess               r   	from_yamlzConfig.from_yamlo   s    Dz$) 	%Q>>!$D	% "2B7$$T*~/F/Fs/K$Qr*GZZ^^GR8N XXgr*
  ^^GR0
"NN9e4!~~lA6!~~lA6%>>*:A>^^J2%>>*:A>&NN+<a@(nn-@!D(nn-@!D#;
 #^^J3!~~lB7#7$..(C
 AEQS@TUm--d3U
U)
;XXj$/!XX&8:LM
 	
M	% 	%H Vs   H(H5(H2c                   g }| j                   j                  s|j                  d       | j                   j                  s|j                  d       |s| j                  s|j                  d       | j
                  s|j                  d       | j
                  D cg c]"  }|j                  t        j                  k(  s!|$ }}|s|j                  d       nt        |      dkD  r|j                  d       | j
                  D cg c]  }|j                   }}t        |      t        t        |            k7  r|j                  d       |S c c}w c c}w )	ziValidate configuration.

        Args:
            skip_ai: If True, skip AI-related validation.
        zsheet.sheet_id is requiredzsheet.data_range is requiredzDgemini_api_key is required (set GEMINI_API_KEY environment variable)z)At least one KPI node is required in treez!At least one KGI node is requiredrP   zOnly one KGI node is allowedzDuplicate node IDs found)rb   rZ   appendr[   rd   rc   r.   r   r   lenr,   set)selfskip_aierrorsn	kgi_nodesidss         r   validatezConfig.validate   s    zz""MM67zz$$MM89t22MM`ayyMMEF !%		D1QVVx||-CQD	DMM=>^aMM89 "YY'qtt''s8s3s8}$MM45 E (s   "E>EEN)rw   z
str | PathrA   ra   )F)r   rG   rA   r6   )r   r   r   r   rB   rf   rh   rj   rD   r   r   r   r   r   ra   ra   d   sN    
!K!Hc.c.1
 1
f r   ra   )r   
__future__r   ru   dataclassesr   r   enumr   pathlibr   typingr   rq   dotenvr	   r+   r   r   r*   rF   rY   ra   r   r   r   <module>r      s    0 " 	 (      sD 	#t 	  
  
  
F ? ? ? < < < ^ ^ ^r   