
    `j7                        d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
mZmZ ddZ	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 dd	Z	 	 	 	 	 	 dd
Z	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 ddZddZy)u  Ross1000 plain XML serializer.

Generates UTF-8 XML documents from Ross1000MovementDayPayload objects.

Expected output shape per movement day:

    <?xml version="1.0" encoding="UTF-8"?>
    <movimenti struttura="058091-CAV-00001" dal="20260501" al="20260531">
      <movimento data="20260507">
        <struttura>
          <codice>058091-CAV-00001</codice>
          <apertura>1</apertura>
          <camereoccupate>1</camereoccupate>
          <cameredisponibili>6</cameredisponibili>
          <lettidisponibili>20</lettidisponibili>
        </struttura>
        <arrivi>
          <cliente>
            <idswh>c3c4a9a2-12ab</idswh>
            <cognome>ROSSI</cognome>
            <nome>MARIO</nome>
            <sesso>M</sesso>
            <datanascita>19830209</datanascita>
            <cittadinanza>100000100</cittadinanza>
            <statoresidenza>100000100</statoresidenza>
            <statonascita>100000100</statonascita>
          </cliente>
        </arrivi>
        <partenze/>
      </movimento>
    </movimenti>

Node ordering inside <cliente> follows the Liguria Ross1000 specification:
  idswh → cognome → nome → sesso → datanascita →
  cittadinanza → statoresidenza → statonascita
  [→ comune_residenza → provincia_residenza → comune_nascita  (optional)]
    )annotations)date)BytesIO)ElementTree)Ross1000GuestPayloadRoss1000MovementDayPayloadRoss1000StrutturaPayloadc                @    t        j                  | |      }||_        |S )z)Append a child element with text content.)r   
SubElementtext)parenttagr   els       2/backend/istat/ross1000/xml/movement_serializer.py_subr   4   s     				,BBGI    c                $    |rt        | ||       yy)z3Append a child element only when text is non-empty.N)r   )r   r   r   s      r   _sub_optionalr   ;   s     VS$ r   c                ^   t        j                  | d      }t        |d|j                         t        |dt	        |j
                               t        |dt	        |j                               t        |dt	        |j                               t        |dt	        |j                               y)z#Append <struttura> block to parent.	strutturacodiceaperturacamereoccupatecameredisponibililettidisponibiliN)	r   r   r   r   strr   camere_occupatecamere_disponibililetti_disponibili)r   r   ss      r   _serialize_strutturar!   E   s    
 	v{3AHi&&'JI../0c)";";<=Y%A%A!BCI$?$? @Ar   c                *   t        j                  | d      }t        |d|j                         t        |d|j                         t        |d|j
                         t        |d|j                         t        |d|j                         t        |d|j                         t        |d|j                         t        |d	|j                         t        |d
|j                         t        |d|j                         t        |d|j                         y)a
  Append <cliente> block to parent.

    Node order follows the Liguria Ross1000 specification exactly:
      idswh, cognome, nome, sesso, datanascita,
      cittadinanza, statoresidenza, statonascita,
      [comune_residenza, provincia_residenza, comune_nascita]
    clienteidswhcognomenomesessodatanascitacittadinanzastatoresidenzastatonascitacomuneresidenzaprovinciaresidenzacomunenascitaN)r   r   r   r$   r%   r&   r'   r(   r)   r*   r+   r   comune_residenzaprovincia_residenzacomune_nascita)r   guestcs      r   _serialize_guestr4   R   s     	vy1A 	GU[[!Iu}}%FEJJGU[[!M5,,-NE../e223NE../ !&(>(>?!)5+D+DE!_e&:&:;r   c                ~   t        j                  | d      }|j                  d|j                  j	                  d             t        ||j                         t        j                  |d      }|j                  D ]  }t        ||        t        j                  |d      }|j                  D ]  }t        ||        y)z,Append a <movimento> block for a single day.	movimentodata%Y%m%darrivipartenzeN)
r   r   setr   strftimer!   r   r9   r4   r:   )r   dayr6   	arrivi_elr2   partenze_els         r   _serialize_movement_dayr@   o   s    
 &&v{;IMM&#((++H56CMM2&&y(;IE*  ((J?Ke, r   c                  t        j                  d      }|j                  d|       |j                  d|j                  d             |j                  d|j                  d             | D ]  }t	        ||        t        |      S )a  Serialize a list of movement day payloads to a UTF-8 XML string.

    The root element is <movimenti> with metadata attributes.
    Each day produces one <movimento data="AAAAMMGG"> child.

    Args:
        days:           Movement day payloads (one per calendar day)
        structure_code: ISTAT structure code (for root attribute)
        start_date:     First day of the export range
        end_date:       Last day of the export range

    Returns:
        UTF-8 XML string with XML declaration.
    	movimentir   dalr8   al)r   Elementr;   r<   r@   _to_utf8_xml)daysstructure_code
start_dateend_daterootr=   s         r   serialize_movement_days_xmlrL      su    * {+DHH[.)HHUJ''12HHT8$$X./c*  r   c                    t        j                   |       }t               }|j                  |ddd       |j                         j	                  d      S )z@Serialize an ElementTree to a UTF-8 XML string with declaration.zUTF-8TF)encodingxml_declarationshort_empty_elements)r   r   writegetvaluedecode)rK   treebufs      r   rF   rF      sE    ""4(D
)CJJsWdQVJW<<>  ))r   N)r   ElementTree.Elementr   r   r   r   returnrV   )r   rV   r   r   r   z
str | NonerW   None)r   rV   r   r	   rW   rX   )r   rV   r2   r   rW   rX   )r   rV   r=   r   rW   rX   )
rG   z list[Ross1000MovementDayPayload]rH   r   rI   r   rJ   r   rW   r   )rK   rV   rW   r   )__doc__
__future__r   datetimer   ior   	xml.etreer   &istat.ross1000.models.movement_payloadr   r   r	   r   r   r!   r4   r@   rL   rF    r   r   <module>r`      s   $L #   !   	    
	 
B
B'
B 

B<<< 
<:--	#- 
-&
*  	
  	@*r   