
    `j                        d Z ddlmZ ddlmZ ddlmZmZmZ ddl	m
Z
 h dZddZdddZdd	Zdd
ZddZdd	 	 	 	 	 ddZddZy)u   Validation helpers for Ross1000 payload assembly.

All validation raises Ross1000ValidationError with a descriptive message.
No silent swallowing of errors — every missing field is surfaced explicitly.
    )annotations)date)Ross1000GuestErrorRoss1000StructureErrorRoss1000ValidationError)get_ross1000_country_code>   12fmmalefemalec                L    | yt        | t              r| j                          S y)NTF)
isinstancestrstrip)values    7/backend/istat/ross1000/validators/payload_validator.py_blankr      s&    }%;;=      c                N    t        |       r|rd| dnd}t        | | d      y)z5Raise Ross1000ValidationError if value is blank/None.[z]  z  is required for Ross1000 exportN)r   r   )r   fieldcontextprefixs       r   requirer      s6    e}$+1WIR%7W&XYY r   c                    t        t        | dd      xs d      j                         }|st        dt        | dd       d      y)z;Validate that a structure has all required Ross1000 fields.
istat_coder   z
Structure id?z is missing istat_codeN)r   getattrr   r   )	structurer   s     r   validate_structurer$   %   sO    WYb9?R@FFHJ$D#677MN
 	
 r   c                  dt        | dd       d| }t        t        | dd      xs d      j                         }|st        d| d      t        | d	d
      }|t        d| d      t        t        | dd      xs d      j                         j	                         }|t
        vrt        d| d|xs d d      t        t        | dd      xs d      j                         j                         }|st        d| d      t        |      t        d| d| d      t        t        | dd      xs d      j                         j                         }|st        d| d      t        |      t        d| d| d      t        t        | dd      xs d      j                         j                         }|st        d| d      t        |      t        d| d| d      y
)zValidate that a guest has all required Ross1000 fields.

    Raises Ross1000GuestError with a descriptive message on the first
    missing required field.
    zguest r    r!   z	 booking 	full_namer   r   z] full_name is requireddate_of_birthNz] date_of_birth is requiredgenderz:] gender is required and must be 'male' or 'female', got 'z(empty)'country_of_birthz] country_of_birth is requiredz1] no Ross1000 country code for country_of_birth='countryz!] country (residence) is requiredz(] no Ross1000 country code for country='nationalityz'] nationality (citizenship) is requiredz,] no Ross1000 country code for nationality=')r"   r   r   r   lower_VALID_GENDERSupperr   )	guest
booking_idctxr&   dob
gender_rawcobr+   r,   s	            r   validate_guest_for_ross1000r6   .   s7    75$,-Yzl
CC GE;39r:@@BI 1SE)@!ABB %$
/C
{ 1SE)D!EFF WUHb17R8>>@FFHJ' u +),A/
 	
 ge/4:
;
A
A
C
I
I
KC 1SE)G!HII %- uEcU!L
 	

 '%B/526<<>DDFG 1SE)J!KLL )1 u<WIQG
 	

 ge]B7=2>DDFLLNK 1SE)P!QRR -5 u@QO
 	
 6r   c               n    t        |       rt        d| d| d      t        |       j                         S )u   Validate and return the idswh token.

    Raises Ross1000ValidationError if idswh is missing — the token must
    already exist in GuestStay; it is never generated here.
    zidswh is missing for guest z / booking z2. Ensure GuestStay records exist before exporting.)r   r   r   r   )idswhguest_idr1   s      r   validate_idswhr:   d   sE     e}%)(;zl K? ?
 	
 u:r   export)r   c                   t               }| D ]9  }t        |dd      }||v rt        d| d| d      |s)|j                  |       ; y)zRaise Ross1000ValidationError if any idswh appears more than once.

    Args:
        payloads: List of Ross1000GuestPayload instances.
        context:  Human-readable label for error messages.
    r8   NzDuplicate idswh 'z' detected in z?. Each guest stay must have a unique regulatory identity token.)setr"   r   add)payloadsr   seenptokens        r   validate_no_duplicate_idswhrC   r   sa     UD7D)D=)#E7.	 BP P  HHUO r   c                    | t        d      |t        d      t        | t              st        d      t        |t              st        d      || k  rt        d      | |fS )zValidate export date range.zstart_date is requiredzend_date is requiredz"start_date must be a date instancez end_date must be a date instancezend_date must be >= start_date)r   r   r   )
start_dateend_dates     r   validate_date_rangerG      sq    %&>??%&<==j$'%&JKKh%%&HII*%&FGGxr   N)r   objectreturnbool)r   )r   rH   r   r   r   r   rI   None)rI   rK   )r1   intrI   rK   )r8   z
str | Noner9   rL   r1   rL   rI   r   )r?   listr   r   rI   rK   )rE   date | NonerF   rN   rI   ztuple[date, date])__doc__
__future__r   datetimer   istat.ross1000.exceptionsr   r   r   #istat.ross1000.models.country_codesr   r.   r   r   r$   r6   r:   rC   rG    r   r   <module>rU      so    #  
 J 8Z
3
l"   
	. r   