
    i                        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  ed       G d	 d
             Z ed       G d d             Zd ZddZddZddZddZdd	 	 	 	 	 	 	 	 	 ddZy)    )annotations)	dataclass)date	timedelta)Iterable)Booking)PrefetchT)frozenc                      e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   d
ed<   ded<   ded<   dZded<   dZded<   y)GuestNightSubjectstrkeyint
booking_id
int | Noneguest_id	full_nameemailphonezdate | Nonedate_of_birth
str | Nonenationalityexemption_reasonFboolis_synthetic_minoris_main_guestN)__name__
__module____qualname____annotations__r   r        (/backend/services/guest_night_service.pyr   r      sH    	HONJJ  $$M4r"   r   c                      e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   y)
GuestNightr   r   r   	guest_keyr   r   r   monthstructure_idproperty_idplatformage_on_nightr   is_minorr   r   r   r   r   r   r   night_indexis_arrival_nightis_departure_nightN)r   r   r   r    r!   r"   r#   r%   r%      sk    NO
JJMN  NJJr"   r%   c                V    | j                  dd      j                  t        d            S )Npropertyproperty_typeguests)select_relatedprefetch_relatedr	   )querysets    r#   with_guest_night_prefetchr7   1   s*    "":?PP r"   c                    t        | d      rd| j                  v r| j                  d   S t        | j                  j	                               S )N_prefetched_objects_cacher3   )hasattrr9   listr3   all)bookings    r#   get_prefetched_guestsr>   7   sD    4599900::""$%%r"   c                    | sy |j                   | j                   z
  }|j                  |j                  f| j                  | j                  fk  r|dz  }|S )N   )yearr'   day)r   on_dateyearss      r#   calculate_age_onrE   @   sP    LL=---Ew{{#}':':M<M<M&NN
Lr"   c                    t        t        | j                  xs d      t        | j                  xs d      z   d      }t	        t        |             }t        ||      S Nr   )maxr   adults_countchildren_countlenr>   )r=   booking_countactual_guest_counts      r#   get_booking_guest_countrN   J   sX    G  %A&W-C-C-Hq)II	M 27;<}011r"   c                    t               }|dk  rg S t        t        t                     d       }|d | }t	        t         j                  xs d      d      }t         fd|D              }|t        |      z
  }t	        ||z
  d      }t        ||      }t	        ||z
  d      }|D 	cg c]  }	t        d j                   d|	j                    j                  |	j                  |	j                  xs d|	j                  xs d|	j                  xs d|	j                  |	j                   xs d t#        |	dd	      r|	j$                  nd |	j&                  

       }
}	t)        |      D ]C  }|
j+                  t        d j                   d|dz     j                  d dddd d d d
             E t)        |      D ]B  }|
j+                  t        d j                   d|dz     j                  d dddd d d 	             D |
d | S c c}	w )Nr   c                <    | j                    | j                  xs dfS rG   )r   id)guests    r#   <lambda>z,build_guest_night_subjects.<locals>.<lambda>Z   s    u222EHHMBr"   )r   c              3     K   | ]I  }t        |j                  j                        't        |j                  j                        dk  rd K y w)N   r@   )rE   r   check_in_date).0rR   r=   s     r#   	<genexpr>z-build_guest_night_subjects.<locals>.<genexpr>_   sM      &EU00'2G2GHT !4!4g6K6KLrQ	 	
&s   AAzbooking-z-guest- is_city_tax_exemptF)
r   r   r   r   r   r   r   r   r   r   z-synthetic-child-r@   T)
r   r   r   r   r   r   r   r   r   r   z-synthetic-adult-)	r   r   r   r   r   r   r   r   r   )rN   sortedr;   r>   rH   r   rJ   sumrK   minr   rQ   r   r   r   r   r   getattrcity_tax_exemption_reasonr   rangeappend)r=   total_guests_countr3   considered_guestsbooking_children_countknown_minorsremaining_slotssynthetic_minor_countsynthetic_adult_countrR   subjectsindexs   `           r#   build_guest_night_subjectsrk   S   sC   09Q	"7+,BF 2 23 W%;%;%@q!A1E & L )3/@+AAO 6 EqI 5G2G GK& '#" 'E! 	7::,gehhZ8zzXXoo+++#++#--))1T 5"6> //--	
  '#  ( ,-wzzl*;EAI;G"::" !%#'	
 .  ,-wzzl*;EAI;G"::" !%
	
 . ''((gs   ,B/HrU   )minor_age_limitc                  t        | d      rt        |       } g }| D ]  }|j                  r|j                  s|j                  |j                  k  r7t	        |      }|sE|j                  |j                  z
  j
                  }|j                  t        d      z
  }|D ]^  }	t        |      D ]L  }
|j                  t        |
      z   }||cxk  r|k  sn +t        |	j                  |      }|	j                  xs |d uxr ||k  }|j                  t        di d|	j                  d|	j                  d|j                  d|d|j                   d	|j"                  d
|j$                  dt'        |j(                  xs d      d|d|d|	j*                  d|	j,                  d|	j.                  d|	j0                  d|	j2                  d|	j4                  d|
dz   d||j                  k(  d||k(         O a  |S )Nr4   r@   )daysr   r&   r   r   r'   r(   r)   r*   rY   r+   r,   r   r   r   r   r   r   r-   r.   r/   r!   )r:   r7   rV   check_out_daterk   rn   r   r`   rE   r   r   ra   r%   r   r   rQ   r'   r(   r)   r   r*   r   r   r   r   r   r   )bookingsperiod_startperiod_end_exclusiverl   guest_nightsr=   ri   total_nightsdeparture_nightsubjectnight_offset
night_dater+   r,   s                 r#   generate_guest_nightsry      sJ    x)*,X6%'L$$G,B,B!!W%:%::-g6..1F1FFLL!009!3DDG %l 3$22YL5QQ
$
I5II/0E0EzR"55  ,O1O  ## !(!1!1")++ $+:: (	
 ).. &-%9%9 %,$7$7 "%W%5%5%;!< &2 "* *1)A)A %,$7$7 #*"3"3 &mm &mm  '.&;&;!" %11$4#$ *4w7L7L)L%& ,6+H' !4   ` r"   N)r=   r   )rC   r   returnr   )r=   r   rz   r   )r=   r   rz   zlist[GuestNightSubject])
rp   zIterable[Booking]rq   r   rr   r   rl   r   rz   zlist[GuestNight])
__future__r   dataclassesr   datetimer   r   typingr   bookings.modelsr   django.db.modelsr	   r   r%   r7   r>   rE   rN   rk   ry   r!   r"   r#   <module>r      s    " ! $  # % $      $  ,&2M)j << < 	<
 < <r"   