
    `j                        d Z ddlmZ ddlZddlmZ ddlmZ  ej                  d      Z	ddZ
ddZ	 	 	 	 	 	 	 	 dd	Z	 	 	 	 	 	 	 	 dd
ZddZddZddZy)z8Deterministic filename generation for ISTAT XML exports.    )annotationsN)date)XmlPayloadValidationErrorz[^a-z0-9_]+c                b    | t        | d      t        | t              st        | d      | S )Nz is requiredz must be a date instance)r   
isinstancer   )value
field_names     )/backend/istat/xml_export/files/naming.py_validate_dater      s;    }':,l(CDDeT"':,6N(OPPL    c                    t        |       j                         j                         j                  dd      }t        j                  d|      }t        j
                  dd|      j                  d      }|S )N-_z_+)strstriplowerreplace_SAFE_PART_REsubre)r   
normalizeds     r
   _safe_filename_partr      s_    U!!#))+33C=J""3
3JsJ/55c:Jr   c                    t        |       }t        |      }|st        d      |st        d      t        |d      }d| d| d|ddS )Nzexport_type is requiredstructure_id is requiredexport_dateistat_r   %Y_%m_%d.xml)r   r   r   )export_typestructure_idr   safe_export_typesafe_structure_id
valid_dates         r
   _build_xml_filenamer$      sk    
 +;7+L9'(ABB'(BCC];J
!"!$5#6ah
t	%r   c                    t        |d      }t        |d      }||k  rt        d      ||k(  rt        d| |      S t        |       }|st        d      d| d|dd	|dd
S )z2Build a deterministic guest movement XML filename.
start_dateend_date4end_date must be greater than or equal to start_date	movimentir   istat_movimenti_r   r   _to_r   )r   r   r$   r   )r    r&   r'   valid_start	valid_endr"   s         r
   build_guest_xml_filenamer.   0   s     !\:Kx4I;'B
 	
 i";kJJ+L9'(BCC ,-Q{8.D
y"$	(r   c                    t        d| |      S )z'Build a deterministic C59 XML filename.c59)r$   )r    r   s     r
   build_c59_xml_filenamer1   L   s     ulK@@r   c                (    t        | d      }d|ddS )u   Build the per-day C59 XML filename used inside a ZIP archive.

    Format: ``C59_YYYYMMDD.xml`` — matches the Ross1000 / Liguria convention.
    report_dateC59_%Y%m%dr   )r   )r3   r#   s     r
   build_c59_daily_xml_filenamer6   R   s"    
  ];J*V$D))r   c                h    t        | d      }t        |d      }||k  rt        d      d|dd|ddS )zjBuild the ZIP archive filename for a multi-day C59 export.

    Format: ``C59_YYYYMMDD_YYYYMMDD.zip``
    r&   r'   r(   r4   r5   r   z.zip)r   r   )r&   r'   r,   r-   s       r
   build_c59_zip_filenamer8   [   sQ    
 !\:Kx4I;'B
 	
 +f%Qy&8==r   )r   zdate | Noner	   r   returnr   )r   objectr9   r   )r   r   r    intr   r   r9   r   )r    r;   r&   r   r'   r   r9   r   )r    r;   r   r   r9   r   )r3   r   r9   r   )r&   r   r'   r   r9   r   )__doc__
__future__r   r   datetimer   istat.xml_export.exceptionsr   compiler   r   r   r$   r.   r1   r6   r8    r   r
   <module>rB      s    > " 	  A 

>*  		&  	
 	8A*>r   