
    i
L                        d dl Z d dlZd dlmZ d dlmZ d dlmZmZmZm	Z	 d dl
mZ d dlmZmZ d dlmZmZ d dlmZ d d	lmZmZ ej.                  ej0                  hZd
ZdZdZdZdZh dZe G d d             Z e G d d             Z!dede"eef   fdZ#dededefdZ$dedededede%f
dZ&de'd ede(e   fd!Z)de'd ede(e   fd"Z*d#e'd ede(e   fd$Z+de,dz  de,fd%Z-d&e,d'e,de%fd(Z.d#e'd)e,dz  d ede/e'   dz  fd*Z0d+ede"e'e,f   fd,Z1d-e(e'   d.e2e'ef   de(e'   fd/Z3d0e'd1e'd2e'd3e'de'f
d4Z4d0e'd1e'd2e'd3e'de'f
d5Z5d6ed7ede%fd8Z6d9e(e   d:e(e   d.e2e'ef   de2e'e/e'   f   fd;Z7d-e"e'd<f   d=e2e'e/e'   f   de%fd>Z8d9e(e   d?e(e   d@e'de(e    fdAZ9de'd@e'd ede(e    fdBZ:ded#e'd ede(e   fdCZ;dDe d@e'de%fdEZ<dDe dedFe(e   de%fdGZ=dede'dFe(e   d ede dz  f
dHZ>ddIded#e'dFe(e   d edJe/e'   dz  de(e!   fdKZ?ddIded#e'dFe(e   d edJe/e'   dz  de!dz  fdLZ@dDe de'd ede fdMZAdedDe dz  de'd eddf
dNZBdedOe!dz  d eddfdPZCded ede!dz  fdQZDded#e'd ede(e   fdRZEy)S    N)combinations)	dataclass)datedatetimetime	timedelta)select)Session
joinedload)ReservationReservationStatus)Room)TableTableCombination   #      )internindoordentrointernointerna)esternoutdoorfuoridehordehorsterrazgiardinpatio>   areasalazonac                   |    e Zd ZU eed<   eed<   ee   ed<   edz  ed<   edz  ed<   eed<   eed<   ed	efd
       Zy)AssignmentCandidatekindlabel	table_idsNassigned_table_idassigned_combination_id	min_seats	max_seatsreturnc                     | j                   S Nr,   )selfs    @/var/www/html/PRENOTAZIONI_IA/backend/app/services/assignment.pywasted_seatsz AssignmentCandidate.wasted_seats"   s    ~~    )	__name__
__module____qualname__str__annotations__listintpropertyr3    r4   r2   r%   r%      sM    
IJCyTz! 4Z'NNc  r4   r%   c                   ,    e Zd ZU eed<   eed<   eed<   y)RoomAssignmentCandidateroom_id	room_name	candidateN)r5   r6   r7   r;   r9   r8   r%   r=   r4   r2   r?   r?   '   s    LN""r4   r?   reservationr-   c                     t        j                  | j                  | j                        }|t	        | j
                        z   }||fS )N)minutes)r   combinereservation_date
start_timer   duration_minutes)rC   start_atend_ats      r2   reservation_windowrL   .   s@     < <k>T>TUH	+*F*FGGFVr4   dayvaluec                 .    t        j                  | |      S r/   )r   rF   )rM   rN   s     r2   combine_date_timerP   4   s    C''r4   first_start	first_endsecond_start
second_endc                     | |k  xr ||k  S r/   r=   )rQ   rR   rS   rT   s       r2   overlaprV   8   s     #@y(@@r4   r@   dbc                 (   t        t              j                  t        j                  | k(  t        j                  j                  d            j                  t        j                  t        j                        }t        |j                  |            S NT)r	   r   wherer@   	is_activeis_order_byr,   namer:   scalarsr@   rW   stmts      r2   get_room_tablesrb   A   s_    %=u}}79L9LT9RS\\]b]l]lnsnxnxyD

4 !!r4   c                 (   t        t              j                  t        j                  | k(  t        j                  j                  d            j                  t        j                  t        j                        }t        |j                  |            S rY   )r	   r   rZ   r@   r[   r\   r]   r,   r^   r:   r_   r`   s      r2   get_room_combinationsrd   F   sk     	''724D4N4N4R4RSW4X	Y	",,.>.C.C	D 	
 

4 !!r4   venue_idc                     t        t              j                  t        j                  | k(        j	                  t        j
                  t        j                        }t        |j                  |            S r/   )	r	   r   rZ   re   r]   r^   idr:   r_   )re   rW   ra   s      r2   get_venue_roomsrh   O   sH    $<dmmx78AA$))TWWUD

4 !!r4   c                     t        j                  d| xs d      j                  dd      j                  d      }|j	                         j                         }t        j                  dd|      S )NNFKD asciiignorez\s+ )unicodedata	normalizeencodedecodecasefoldstripresub)rN   
normalizeds     r2   normalize_room_textrx   T   s[    &&vu{;BB7HU\\]deJ$$&,,.J66&#z**r4   rA   
preferencec                    t        |       t        |      rsyk(  ryv sv ryj                         D ch c]  }|t        vs| }}j                         D ch c]  }|t        vs| }}|r|r|j                  |      ryt	        fdt
        D              rt	        fdt
        D              S t	        fdt        D              rt	        fdt        D              S yc c}w c c}w )NFTc              3   &   K   | ]  }|v  
 y wr/   r=   .0keywordnormalized_preferences     r2   	<genexpr>z/room_name_matches_preference.<locals>.<genexpr>j        
X7++
X   c              3   &   K   | ]  }|v  
 y wr/   r=   r}   r~   normalized_room_names     r2   r   z/room_name_matches_preference.<locals>.<genexpr>k        _w722_r   c              3   &   K   | ]  }|v  
 y wr/   r=   r|   s     r2   r   z/room_name_matches_preference.<locals>.<genexpr>l   r   r   c              3   &   K   | ]  }|v  
 y wr/   r=   r   s     r2   r   z/room_name_matches_preference.<locals>.<genexpr>m   r   r   )rx   splitIGNORED_ROOM_TOKENSintersectionanyINTERIOR_PREFERENCE_KEYWORDSEXTERIOR_PREFERENCE_KEYWORDS)rA   ry   tokenroom_tokenspreference_tokensr   r   s        @@r2   room_name_matches_preferencer   Z   s    .y9/
;'< 44 448LPe8e&:&@&@&BgUeSfFf5gKg,A,G,G,In5UZmMmnn([-E-EFW-X

X;W
XX_B^___

X;W
XX_B^___ hns   C0C0%C53C5area_preferencec                     t        |      }|sy t        | |      }|D ch c]$  }t        |j                  |      r|j                  & }}|xs d S c c}w r/   )rx   rh   r   r^   rg   )re   r   rW   r   roomsroommatching_idss          r2   resolve_preferred_room_idsr   r   sc    /@ Hb)E '		3HI 	L 
 4s   )Atablec                     | j                   j                         r!t        | j                         | j                   fS d| j                   fS )Ni'  )r^   isdigitr;   )r   s    r2   table_sort_valuer      s8    zz5::

**5::r4   r(   tables_by_idc                 $    t        | fd      S )Nc                      t        |          S r/   r   table_idr   s    r2   <lambda>z!order_table_ids.<locals>.<lambda>   s    2B<PXCY2Z r4   key)sorted)r(   r   s    `r2   order_table_idsr      s    )!Z[[r4   start_aend_astart_bend_bc                 4    t        ||      t        | |      z
  S r/   )minmaxr   r   r   r   s       r2   range_overlapr      s    ues7G444r4   c                 ,    ||k  r||z
  S || k  r| |z
  S y)Nr   r=   r   s       r2   	range_gapr      s'    wwr4   firstsecondc           	         | j                   }| j                   | j                  z   }| j                  }| j                  | j                  z   }|j                   }|j                   |j                  z   }|j                  }|j                  |j                  z   }	t	        ||||	      }
t	        ||||      }t        ||||      }t        ||||	      }t        t        t        t        | j                  |j                        dz              }t        t        t        t        | j                  |j                        dz              }|t        k  r|
|k\  ry|t        k  r||k\  ryy)Ng      ?TF)xwidthyheightr   r   r   MIN_TABLE_EDGE_OVERLAP_UNITSr;   r   PHYSICAL_JOIN_GAP_UNITS)r   r   
first_leftfirst_right	first_topfirst_bottomsecond_leftsecond_right
second_topsecond_bottomvertical_overlaphorizontal_overlaphorizontal_gapvertical_gaprequired_vertical_overlaprequired_horizontal_overlaps                   r2   tables_are_physically_joinabler      s3   J''EKK'KI77U\\)L((K88fll*LJHHv}},M$Yj-X&z;\Zz;\RNYj-PL #$@#c%,,X^XeXeFfimFmBn o"%&BCEKKY_YeYeHfimHmDn"o005EIb5b..3EId3dr4   tablescombinations_listc                 x   | D ci c]  }|j                   t                }}i }| D ]D  }|j                  s|j                  |j                  g       j	                  |j                          F |j                         D ]>  }t        |d      D ]-  \  }}||   j                  |       ||   j                  |       / @ t        | d      D ]b  \  }	}
t        |	|
      s||	j                      j                  |
j                          ||
j                      j                  |	j                          d |D ]{  }t        |j                  |      D cg c]	  }||v s| }}t        t        |      dz
        D ]7  }||   }||dz      }||   j                  |       ||   j                  |       9 } |S c c}w c c}w )N      )rg   set
join_group
setdefaultappendvaluesr   addr   r   r(   rangelen)r   r   r   r   graphjoin_groupsgrouped_table_idsfirst_id	second_idfirst_tablesecond_tablecombination_itemr   ordered_idsindexs                  r2   build_join_graphr      s   
 +11UXXsu_1E1(*K J""5#3#3R8??IJ )//1 +#/0A1#E 	+Hi(O	*)  *	++
 &2&!%< 3!\-k<Hknn!!,//2loo"";>>2	3 . +0?@P@Z@Z\h0iHmuy~m~x3{+a/0 	+E"5)H#EAI.I(O	*)  *		++ L3 2$ @s   F2	F7F7.
join_graphc                     t        |       | d   g}t               |rG|j                         }|v rj                  |       |j                  fd||   D               |rGk(  S )Nr   c              3   6   K   | ]  }|v s|vs|  y wr/   r=   )r}   neighborsubsetvisiteds     r2   r   z&subset_is_connected.<locals>.<genexpr>   s"     wXTZHZ_gov_vws   	)r   popr   extend)r(   r   to_visitcurrentr   r   s       @@r2   subset_is_connectedr      sl    ^F!~HG
,,.gGwG1Dww  fr4   explicit_combinationsguestsc                     | r|dk  rg S | D ci c]  }|j                   | c}t        | t              D cg c]  }|j                    }}t        | |      }|D ch c]   }t	        t        |j
                              " }}g }t               }	|D ]\  }
|
fg}|s|j                         }t	        t        |            }||	v r,|	j                  |       t        |      t        kD  st        ||      s\t        t        |            }|D cg c]  }|   	 }}t        d |D              }t        |      dk\  rQ||vrM||k\  rH|j                  t!        ddj#                  d |D              |d d t        d |D              |	             |D ch c]  }||   D ]  }||vr|
  }}}t        |fd
d      D ]*  }|j                  t	        t        g ||                   , |rR_ |S c c}w c c}w c c}w c c}w c c}}w )Nr   r   c              3   4   K   | ]  }|j                     y wr/   r0   r}   r   s     r2   r   z7build_dynamic_combination_candidates.<locals>.<genexpr>   s     GEOOG   r   combinationz + c              3   4   K   | ]  }|j                     y wr/   )r^   r   s     r2   r   z7build_dynamic_combination_candidates.<locals>.<genexpr>  s     (O(Or   c              3   4   K   | ]  }|j                     y wr/   )r+   r   s     r2   r   z7build_dynamic_combination_candidates.<locals>.<genexpr>  s     %Q%eoo%Qr   r&   r'   r(   r)   r*   r+   r,   c                      t        |          S r/   r   r   s    r2   r   z6build_dynamic_combination_candidates.<locals>.<lambda>  s    IYZfgoZpIq r4   T)r   reverse)rg   r   r   r   tupler(   r   r   r   r   MAX_DYNAMIC_COMBINATION_SIZEr   r   r:   sumr   r%   join)r   r   r   r   ordered_table_idsr   r   explicit_setsdynamic_candidatesvisited_subsetsstart_table_idfrontierr   normalized_subsetordered_subsetr   subset_tablesr,   neighbor_idneighbor_idsr   s                       @r2   $build_dynamic_combination_candidatesr	     sJ   
 Vq[	178EHHeO8L/5fBR/STeTT!&*?NJWlmCSU6"2"<"<=>mMm46,/EO+ &R,:+<*=\\^F %fVn 5 O3 12$%(DDL_`qs}L~,T2C-DlSNDRS\(3SMSGGGI>"a',=],RW`djWj"))'*#jj(O(OO"0*.04"%%Q=%Q"Q"+
  !2#-h#7  &77 L   &l8q{   A Rf-N/@-N+-N&O PQRE &RP _ 9Tm$ T"s   G6G;%H HH
c                    t        | |      }|D ci c]  }|j                  | }}|D ch c]  }|j                   }}t        | |      }|D cg c]G  }t        d|j                  |j                  g|j                  d |j
                  |j                        I }}|D ]  }	t        |	j                        j                  |      s(t        |	j                  |      }
|j                  t        d|	j                  |
d |	j                  |	j
                  |	j                                |j                  t        |||             |S c c}w c c}w c c}w )Nr   r   r   )rb   rg   rd   r%   r^   r+   r,   r   r(   issubsetr   r   r   r	  )r@   r   rW   r   r   r   active_table_idsr   
candidatesr   r   s              r2   build_candidatesr    sP   Wb)F178EHHeO8L8.45U551'2>   	**xxj#hh$(oooo	
J  - 
;(()223CD%k&;&;\J"!&&%"&(3%//%//
	
	
  :6CXZ`abE 95s   EEAEc                 B   t        t              j                  t        t        j                        t        t        j
                        t        t        j                        t        t        j                              j                  t        j                  |k(  t        j                  | k(        j                  t        j                  t        j                  j                         t        j                        }t!        |j#                  |      j%                               S r/   )r	   r   optionsr   customerassigned_tableassigned_combinationstatus_historyrZ   re   rG   r]   rH   r   desc
created_atr:   r_   unique)rM   re   rW   ra   s       r2   reservations_for_assignmentr  A  s    {	{++,{112{778{112	

 
{##x/1M1MQT1T	U	+((+*<*<*A*A*C[E[E[	\ 	 

4 '')**r4   rB   c                      | j                   |k\  S r/   r0   )rB   r   s     r2   candidate_is_compatibler  P  s    &((r4   scheduled_reservationsc                    t        |      \  }}|D ]  }|j                  |j                  k(  s|j                  t        v r/|j                  |j
                  Hg }|j                  |j                  g}n"|j                  |j                  j                  }t        | j                        j                  |      st        |      \  }}t        ||||      s y y)NTF)rL   rg   statusNON_BLOCKING_STATUSESr)   r*   r  r(   r   r   rV   )	rB   rC   r  rJ   rK   	scheduledscheduled_table_idsscheduled_startscheduled_ends	            r2   candidate_conflictsr#  T  s    
 *+6Hf+ 	<<;>>)Y-=-=AV-V&&.93T3T3\ &&2#,#>#>"?++7"+"@"@"J"J9&&'445HI);I)F&8V_mD r4   c                      t        | j                  |      }|D cg c]'  }t        | j                        rt        | |      s|) }}|sy |j	                   fd       |d   S c c}w )Nc                     | j                   dk(  rdnd| j                  j                  z
  t        | j                        | j
                  fS Nr   r   r   )r&   r,   r   r   r(   r'   )rB   rC   s    r2   r   z'select_best_candidate.<locals>.<lambda>}  sC    7*A+"4"44	##$OO	
 r4   r   r   )r  r   r  r#  sort)rC   r@   r  rW   r  rB   
compatibles   `      r2   select_best_candidater)  l  s     "';+=+=rBJ $"9k.@.@A#I{<RS 	J  OO
   a=#s   ,A(preferred_room_idsr+  c                >    t        ||      }|r|D cg c]  }|j                  |v s| }}g }|D ]N  }t         |j                  ||      }||j                  t	        |j                  |j
                  |             P |j                   fd       |S c c}w )N)r@   rA   rB   c                     | j                   j                  dk(  rdnd| j                   j                  j                  z
  t	        | j                   j
                        | j                  | j                   j                  fS r&  )rB   r&   r,   r   r   r(   rA   r'   )optionrC   s    r2   r   z0list_available_room_candidates.<locals>.<lambda>  sh    !!&&'1Aq&&););;  **+""
 r4   r   )rh   rg   r)  r   r?   r^   r'  )	rC   re   r  rW   r+  r   r   room_candidatesrB   s	   `        r2   list_available_room_candidatesr0    s     Hb)E"'I$4776H+HII57O 

)+tww@VXZ[	#))#	
	

 
   1 Js
   BBc                2    t        | ||||      }|sy |d   S )Nr*  r   )r0  )rC   re   r  rW   r+  r  s         r2   "select_best_candidate_across_roomsr2    s/     0
-J a=r4   c                    | j                   | j                  dk(  r| S t        ||      }t        t	        | j
                              }|D ]I  }t        t	        |j
                              |k(  s%|j                  | _         |j                  | _        | c S  t        || j                  | j
                  | j                  | j                  d      }|j                  |       |j                          |j                  | _         | S )Nr   T)r@   r^   r(   r+   r,   r[   )r*   r&   rd   r   r   r(   rg   r^   r'   r   r+   r,   r   flush)rB   r@   rW   r   normalized_targetr   auto_combinations          r2   ensure_candidate_combinationr7    s    ((4	'8Q-gr:fY%8%89:- (22348II0@0C0CI-.33IO	 (__%%%%%% FFHHJ(8(;(;I%r4   c                     |d | _         d | _        y t        |||      }|j                   | _         |j                  | _        y r/   )r)   r*   r7  )rC   rB   r@   rW   s       r2   assign_candidater9    sG     (,%.2+,YDI$-$?$?K!*3*K*KK'r4   room_candidatec                 j    |d | _         d | _        y t        | |j                  |j                  |       y r/   )r)   r*   r9  rB   r@   )rC   r:  rW   s      r2   assign_room_candidater<    s8    
 (,%.2+[.":":N<R<RTVWr4   c                 T   t        | j                  | j                  |      }t        | d |       |j	                          t        | j                  | j                  |      }t        | | j                  |||      }t        | ||       |j	                          |j                  |        |S Nr*  )	r  rG   re   r<  r4  r   r   r2  refresh)rC   rW   r  r+  rB   s        r2   reassign_single_reservationr@    s    +K,H,H+J^J^`bcI+tR0HHJ3K4H4H+JeJegij2
-I +y"5HHJJJ{r4   c                 <   t        | ||      }|D ]  }d |_        d |_         |j                          |D ]I  }|j                  t
        v rt        ||j                  |      }t        |||||      }t        |||       K |j                          t        | ||      S r>  )r  r)   r*   r4  r  r  r   r   r2  r<  commit)rM   re   rW   reservationsrC   r+  rB   s          r2   recalculate_day_assignmentsrD    s    .sHbAL# 3(,%.2+3 HHJ# :!667+B]B]_ab61
	 	k9b9: IIK&sHb99r4   )Fru   ro   	itertoolsr   dataclassesr   r   r   r   r   
sqlalchemyr	   sqlalchemy.ormr
   r   app.models.reservationr   r   app.models.roomr   app.models.tabler   r   	cancelledno_showr  r   r   r   r   r   r   r%   r?   r   rL   rP   boolrV   r;   r:   rb   rd   rh   r8   rx   r   r   r   r   dictr   r   r   r   r   r   r	  r  r  r  r#  r)  r0  r2  r7  r9  r<  r@  rD  r=   r4   r2   <module>rP     s   	  " ! 4 4  . A   4 +446G6O6OP !  ! S n .     # # #K E(H:L4M (4 ( ( (AAA A 	A
 
A"S "g "$u+ "
"3 "G "=M8N ""c "w "4: "
+sTz +c +C S T 0   sTz  w  [^_b[cfj[j  E eCHo \tCy \S%Z8H \TRUY \53 5s 5S 5 5 5s 3  S S %  4 4K,- sEz" 
#s3x-	B5c? S#c(]@S X\ 7K7 017 7 

	7t$c $3 $G $EX@Y $N+T +S +g +${J[ +)': )C )D )" !- 
	0 !- 		
 4B +/""" !-" 		" C4" 

!""V +/ !- 		 C4 t#(,? # SZ _r 4LL"T)L L 		L
 
L 	X	X+d2	X 		X 
		X[ g JadhJh $:T :S :g :${J[ :r4   