
    `j                        d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	 ddl
mZ ddlmZ ddlmZmZ dd	lmZ dd
ZddZddZddZddZ	 	 	 	 	 	 	 	 ddZy)a  Resolve guest data into Ross1000 guest payloads.

Reuses the existing guest normalization pipeline (apply_istat_guest_defaults)
to fill missing fields, then maps to Ross1000-specific 9-digit country codes.

Does NOT touch the TXT export, C59, or Alloggiati pipelines.
    )annotations)Any)apply_istat_guest_defaults)Ross1000GuestErrorRoss1000ValidationError)get_ross1000_country_code)Ross1000GuestPayload)validate_guest_for_ross1000validate_idswh)normalize_countryc                    t        | xs d      j                         j                         }|j                  dd      }t	        |      dk(  r
|d   |d   fS |dfS )u   Split full_name into (cognome, nome) — surname first, given name second.

    Convention: "ROSSI MARIO" → cognome="ROSSI", nome="MARIO"
    Single-word names → cognome=name, nome=""
     N      r   )strstripuppersplitlen)valuerawpartss      2/backend/istat/ross1000/services/guest_resolver.py_normalize_name_partr      s[     ekr

 
 
"
(
(
*CIIdAE
5zQQxq!!7N    c                    | t        d      	 | j                  d      S # t        $ r}t        dt        |              |d}~ww xY w)z*Format a date as AAAAMMGG (e.g. 19830209).Nz-date_of_birth is required for Ross1000 exportz%Y%m%dz+date_of_birth must be a date instance, got )r   strftimeAttributeErrortype)dobexcs     r   _format_date_aaaammggr"   )   sU    
{%&UVV||H%% %9$s)E
	s     	AAAc                    t        t        | dd      xs d      j                         j                         }|dv ry|dv ryt	        d| d|xs d	 d
      )u   Resolve gender to Ross1000 sesso code: 'M' or 'F'.

    Accepts: 'male'/'M'/'m' → 'M', 'female'/'F'/'f' → 'F'.
    Raises Ross1000GuestError if the value is missing or unrecognised.
    genderr   )malem1M)femalef2F[guest z:] gender is required and must be 'male' or 'female', got 'z(empty)')r   getattrr   lowerr   )guestguest_idr   s      r   _resolve_genderr3   5   sq     geXr*0b
1
7
7
9
?
?
AC
  
""

(  y!	$ r   c           	         t        |       }|st        d| d| d|  d      t        |      }|t        d| d| d| d      |S )z5Normalize ISO-2 and resolve to 9-digit Ross1000 code.r-   z] z is missing or unresolvable: 'r.   z] no Ross1000 country code for z=')r   r   r   )r   fieldr2   
normalizedcodes        r   _resolve_country_coder8   F   st    "5)J hZr%(FugQO
 	
 %Z0D| hZ>ugR
|STU
 	
 Kr   c                F    | yt        |       j                         }|r|S dS )z(Return stripped string or None if blank.N)r   r   )r   ss     r   _optional_strr;   U   s)    }E
A1tr   c                &   t        |        t        | dd      xs d}t        |||      }t        | |       t	        t        | dd            \  }}t        | |      }t        t        | dd            }t        t        | dd      d|      }	t        t        | d	d      d	|      }
t        t        | d
d      d
|      }t        t        | dd            }t        t        | dd            }t        t        | dd            }t        |||||||
|	|||      S )u  Build a validated Ross1000 guest payload from a Guest model instance.

    Steps:
    1. Apply ISTAT guest defaults (fills missing country/nationality from extra_data)
    2. Validate all required fields
    3. Resolve gender → sesso code
    4. Map to 9-digit ISTAT country codes
    5. Collect optional municipality fields
    6. Return immutable payload

    Args:
        guest:      Guest model instance (already prefetched)
        booking_id: Parent booking ID (for error context)
        idswh:      Permanent regulatory identity token from GuestStay

    Returns:
        Validated, immutable Ross1000GuestPayload

    Raises:
        Ross1000GuestError:      On missing/invalid guest fields
        Ross1000ValidationError: On missing idswh or country mapping
    idr   )r2   
booking_id)r>   	full_nameNdate_of_birthcountry_of_birthcountrynationalitycityregioncity_of_birth)idswhcognomenomesessodatanascitacittadinanzastatoresidenzastatonascitacomune_residenzaprovincia_residenzacomune_nascita)
r   r/   r   r
   r   r3   r"   r8   r;   r	   )r1   r>   rG   r2   validated_idswhrH   rI   rJ   rK   rN   rM   rL   rO   rP   rQ   s                  r   build_ross1000_guest_payloadrS   a   s8   : u%udA&+!H %UX*UO  *= )T)JKMGT E8,E ((MNK ))402DhL +y$'HN )}d+]HL
 %WUFD%AB'x(FG"75/4#HIN!%!)/% r   N)r   
str | Nonereturnztuple[str, str])r    r   rU   r   )r1   r   r2   intrU   r   )r   rT   r5   r   r2   rV   rU   r   )r   r   rU   rT   )r1   r   r>   rV   rG   r   rU   r	   )__doc__
__future__r   typingr   guests.guest_defaultsr   istat.ross1000.exceptionsr   r   #istat.ross1000.models.country_codesr   &istat.ross1000.models.movement_payloadr	   +istat.ross1000.validators.payload_validatorr
   r   services.country_utilsr   r   r"   r3   r8   r;   rS    r   r   <module>ra      sq    #  < Q I G 5
	"LL L 	L
 Lr   