o
    *j8@                     @   s  d Z ddlZddlZddlZddlmZmZmZ e	e
j ZejZed Zed Zdd Zd*ded	ed
efddZdadadadag adadadadadadag ag a g a!g a"da#da$da%da&da'da(da)da*da+da,da-da.da/da0da1da2da3da4da5da6da7g a8g a9i a:i a;i a<i a=i a>i a?i a@daAdaBdaCg aDeE aFi aGdaHdaIded
efddZJd+d d!ZKd"d# ZLded$ed
efd%d&ZMd,d$ed'ed
efd(d)ZNzeK  W dS  eOy   Y dS w )-u  
config.py — Carrega configuracao de config.yaml e variables.yaml

Os arquivos YAML ficam na raiz do projeto (um nivel acima de scripts/).
Para usar arquivos alternativos, chame init_config() antes de importar
qualquer outro modulo do projeto:

    import config
    config.init_config("/caminho/para/meu_config.yaml",
                       "/caminho/para/minhas_variaveis.yaml")

Ordem de busca dos arquivos padrao:
  1. Variavel de ambiente CONFIG_FILE / VARIABLES_FILE
  2. <PROJECT_ROOT>/config.yaml e <PROJECT_ROOT>/variables.yaml
    N)datetime	timedeltadatezconfig.yamlzvariables.yamlc                 C   s   zddl }W n ty   tdw t| } |  s#td|  dt| dd}||W  d   S 1 s9w   Y  dS )zCCarrega um arquivo YAML; lanca FileNotFoundError com mensagem util.r   NzYPyYAML e necessario para ler os arquivos de configuracao.
Instale com: pip install pyyamlz(Arquivo de configuracao nao encontrado: z7
Crie o arquivo ou passe --config / --vars-file no CLI.zutf-8)encoding)yamlImportErrorpathlibPathexistsFileNotFoundErroropenZ	safe_load)pathr   f r   =/dados/sismom/SisMOM/sismom_fig/Figuras_Eta/scripts/config.py
_load_yaml"   s   

$r   	run_inputref_datereturnc                 C   sl   t |  } t| dkr|  r| S |  r.t| dkr.| d}|p&t }|d| S td|  d)u^  
    Resolve o identificador da rodada para o formato completo YYYYMMDDHH.

    Formatos aceitos
    ----------------
    "2026060600"  -> "2026060600"   (YYYYMMDDHH, 10 digitos)
    "00"          -> hoje + "00"    (HH, 2 digitos — usa data do sistema ou ref_date)
    "0"           -> hoje + "00"    (H, 1 digito  — completado com zero)
    "12"          -> hoje + "12"

    Parameters
    ----------
    run_input : tag completo ou apenas a hora (HH)
    ref_date  : data de referencia (padrao: hoje, datetime.date.today())

    Raises
    ------
    ValueError se o formato nao for reconhecido.
    
      z%Y%m%dzFormato de rodada invalido: 'z8'.
Use YYYYMMDDHH (ex: 2026060600) ou HH (ex: 00 ou 12).)	strstriplenisdigitzfill_datetodaystrftime
ValueError)r   r   hourr   r   r   r   resolve_run_tag9   s   

r!               gQ?Fg@xDz>f4z.binz%Y%m%d%Hsaidalogsx   pngDEFLATEr      templatec                 C   s$   |  dd dd dd ddS )	a  Converte placeholders {yyyy}{mm}{dd}{hh} para formato strftime.

    Exemplos:
      {yyyy}{mm}{dd}{hh}  ->  %Y%m%d%H   (10 chars, padrao 2D)
      {yyyy}{dd}{hh}      ->  %Y%d%H     (8 chars, 3D sem mes)
      {yyyy}{mm}{dd}      ->  %Y%m%d     (8 chars, sem hora)
    {yyyy}z%Y{mm}z%m{dd}z%d{hh}z%H)replace)r+   r   r   r   _template_to_strftimeu   s   r1   c                 C   s  | pt jdt} |pt jdt}t| at|at	t}t	tdg }|d }|p<t jddp<t
|dd}|sCtdt|atttd	d
 ttd
d ttdd ttdd at|d at|d add ttD a|d }t|d at|d at|d at|d at|d a|dpg }|dpg }	dd |D add |	D attattatrtdkrtt td td  td  dnda!t"j#tt"j$d a%nt|d!pda!t"&tttd t!  ta%trt"j#tt"j$d a'nt"&tttd t  ta'|d" }
t|
d# a(t
|
d$ a)t
|
d% *d&ta+t
|
d' a,t
|
d(d)}t-|a.t|
d*d+a/t|
d,d+a0t|
d-d+a1|d. }t
|d/dpit jd0da2t
|d1da3t3rzt4t3tnda5t
|d2d3a6t
|d4d5a7|d6i }t|d7d8a8t
|d9d:a9|d;i }t
|d<d=a:t|d>da;t|d?d@a<t|dAdBa=t|dCd+a>t|dDd+a?|a@dEd t@D aAdFdG t@D aBdHdG t@D aCd}i aDt@D ]}|tD|dI < |tEt|dJdpdd7 }q|aFdKdG t@D aGdLdG t@D aHdMdG t@D aIdNdG t@D aJdOd t@D aKtLtKaMdPdG t@D aNd	S )Qa*  
    Inicializa (ou reinicializa) todas as constantes a partir dos arquivos YAML.

    Chamado automaticamente na importacao do modulo com os arquivos padrao.
    Pode ser chamado novamente pelo main.py quando o usuario passa --config
    ou --vars-file, ANTES de importar reader, export_cog etc.

    Parameters
    ----------
    config_file : str | Path | None
        Caminho para config.yaml (None = usa padrao ou env CONFIG_FILE)
    vars_file   : str | Path | None
        Caminho para variables.yaml (None = usa padrao ou env VARIABLES_FILE)
    ZCONFIG_FILEZVARIABLES_FILEZ	variablesrunRUN_TAGr"   tagzTag da rodada nao definido.
Use --run YYYYMMDDHH ou --run HH (ex: --run 00 usa hoje 00Z),
ou defina a variavel de ambiente RUN_TAG.N         r   ZntimesZdt_hoursc                 S   s   g | ]}t t|t d  qS ))Zhours)T0r   DT_HOURS).0ir   r   r   
<listcomp>       zinit_config.<locals>.<listcomp>ZgridZnxnyZlon0Zlat0ZdlonZ
lat_levelsZ
lon_levelsc                 S      g | ]}t |qS r   floatr:   vr   r   r   r<          c                 S   r?   r   r@   rB   r   r   r   r<      rD   r#   r   r$   )dtypeZdlatZmodelZundefrF   Zfile_prefix	{run_tag}Zfile_suffixZfile_timestampz{yyyy}{mm}{dd}{hh}fixedFZyrev
sequentialpaths	data_baseSISMOM_DATA_BASEdata_dir
output_dirr%   log_dirr&   ZfigureZdpir'   extr(   cogcompressr)   ZzlevelZ	predictorr   Z	tile_sizer*   Z
fill_undefZlon_180c                 S   s   g | ]}|d  qS )namer   rB   r   r   r   r<     rD   c                 S   s"   i | ]}|d  | d|d  qS )rS   descriptiongetrB   r   r   r   
<dictcomp>     " zinit_config.<locals>.<dictcomp>c                 S   s   i | ]}|d  | ddqS )rS   Zunitsr"   rU   rB   r   r   r   rW     r=   rS   nlevc                 S   s&   i | ]}|d  t |ddpdqS )rS   rY   r   intrV   rB   r   r   r   rW     s   & c                 S   s2   i | ]}|d  t |ddpddkrdndqS )rS   rY   r      r   rZ   rB   r   r   r   rW     s   2 c                 S   "   i | ]}|d  t |dg qS )rS   ZlevelslistrV   rB   r   r   r   rW     rX   c                 S   r]   )rS   Zplot_levelsr^   rB   r   r   r   rW     rX   c                 S       g | ]}| d dr|d qS )precipFrS   rU   rB   r   r   r   r<          c              
   S   s@   i | ]}|d  | dd| dd| dd| dddqS )	rS   cmapZviridisvminNvmaxra   F)rc   rd   re   ra   rU   rB   r   r   r   rW     s    



)OosenvironrV   _DEFAULT_CONFIG_DEFAULT_VARIABLESr   r	   _CONFIG_FILE
_VARS_FILEr   r   r   r!   r3   r   r[   r8   NTIMESr9   range
TIMESTAMPSNXNYrA   LON0LAT0DLON
LAT_LEVELS
LON_LEVELSboolIRREGULAR_LATIRREGULAR_LONroundDLATnparrayZfloat64LATSZlinspaceLONSUNDEFDTYPEr0   FILE_PREFIXFILE_SUFFIXr1   FILE_TIMESTAMP_FMT	FIXED_RUNYREV
SEQUENTIALrL   DATA_DIR_TEMPLATE_resolve_path_templateDATA_DIR
OUTPUT_DIRLOG_DIRDPIFIG_EXTCOG_COMPRESS
COG_ZLEVELCOG_PREDICTORCOG_TILE_SIZECOG_FILL_UNDEF
COG_LON180	VARIABLES	VAR_NAMESVAR_DESC	VAR_UNITS	VAR_INDEXmaxNVARS_FIELDSVAR_NLEVVAR_NDIM
VAR_LEVELSVAR_PLOT_LEVELSPRECIP_VARSset
PRECIP_SETCMAP_CONFIG)Zconfig_file	vars_filerun_tagZcfgZvars_rawr2   Zraw_taggZ_lat_lev_rawZ_lon_lev_rawmZ_ts_tplpZfigrQ   Z_offsetZ_vr   r   r   init_config   s    

,. $
r   c                   C   s   dd t D S )zGRetorna lista de nomes de variaveis com enabled=true em variables.yaml.c                 S   r`   )enabledTrS   rU   rB   r   r   r   r<   $  rb   z enabled_vars.<locals>.<listcomp>)r   r   r   r   r   enabled_vars"  s   r   r   c                 C   sl   | r
|r
t |dk r| S | d|d|d|dd d|dd d	|dd
 d|d
d S )a  
    Substitui variaveis de template em um caminho de dados.

    Variaveis suportadas
    --------------------
    {data}     -> YYYYMMDDHH  (run_tag completo)
    {run_tag}  -> YYYYMMDDHH  (alias de {data})
    {yyyy}     -> YYYY (ano 4 digitos)
    {mm}       -> MM   (mes 2 digitos)
    {dd}       -> DD   (dia 2 digitos)
    {hh}       -> HH   (hora 2 digitos)

    Exemplos
    --------
    template = "/dados/sismom/sismom_forecast/{data}/regional/eta/2D"
    run_tag  = "2026060600"
    -> "/dados/sismom/sismom_forecast/2026060600/regional/eta/2D"

    template = "/dados/sismom/sismom_forecast/{yyyy}{mm}{dd}{hh}/regional/eta/2D"
    -> "/dados/sismom/sismom_forecast/2026060600/regional/eta/2D"
    r   z{data}rG   r,   Nr5   r-   r6   r.   r7   r/   )r   r0   )r+   r   r   r   r   r   '  s   r   basec                 C   s^   |rd|v rt || S tj|| dddS trt t| S tr(tjt| dddS tjd| S )uk  
    Resolve o caminho dos dados para uma rodada.

    Prioridade
    ----------
    1. --data_base CLI  (base != "")  — retrocompat ou template
    2. data_dir no config.yaml        — suporta template ou caminho fixo
    3. SISMOM_DATA_BASE env            — base fixa (retrocompat)
    4. data/ local                    — fallback de desenvolvimento
    {ZregionaletaZ2Ddata)r   rf   r   joinr   rL   )r   r   r   r   r   build_data_dirJ  s   

r   )N)NNN)r"   )P__doc__rf   r   Znumpyr{   r   r   r   r   r	   __file__parentZresolveZSCRIPTS_DIRZPROJECT_ROOTrh   ri   r   r   r!   r3   r8   rl   r9   rn   ro   rp   rq   rr   rs   rz   r~   r}   rt   ru   rw   rx   r   r   r   r   r   r   rL   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rj   rk   r1   r   r   r   r   	Exceptionr   r   r   r   <module>   sT    %
 #