
    Ti                     0    d dl mZmZmZmZ d dlmZ ddZy)    )OptionalDictAnyUnion)
db_servicec                   K   | j                  dg       }|D cg c](  }|j                  d      dv r|j                  d      s|* }}|sy|j                  d        g }|D ]o  }|j                  dd	      |j                  d
d	      cd}|D ],  }	t        fd|	D              s|	j                  |       d} n |r^|j                  |g       q |j                  d        |sy|d   }
|
j                  d        t	        |
      |k  rC|
d   }|j                  dd	      |j                  dd	      z   |z   }t        d |
D              }||fS d	}t        d |
D              }||z   }||fS c c}w w)z
    Calculates the next best position for a new element on the canvas.
    This final version uses a robust row detection algorithm to handle complex layouts.
    elementstype)image
embeddablevideo	isDeleted)r   r   c                 J    | j                  dd      | j                  dd      fS )Nyr   xgetes    F/home/jay/workspace/tools/ai-image-gen/jaaz-app/server/utils/canvas.py<lambda>z1find_next_best_element_position.<locals>.<lambda>   s    quuS!}aeeCm&D     )keyr   r   heightFc           
   3      K   | ]S  }t        |j                  d d            t        z   |j                  d d      |j                  dd      z         k   U ywr   r   r   N)maxr   min).0rr   r   s     r   	<genexpr>z2find_next_best_element_position.<locals>.<genexpr>   sO     lcd3q!%%Q-(3q6z155a=155QY[\K];]+^^ls   AATc                 >    t        d | D              t        |       z  S )Nc              3   @   K   | ]  }|j                  d d        ywr   r   Nr   r   r   s     r   r!   zDfind_next_best_element_position.<locals>.<lambda>.<locals>.<genexpr>%   s     !=A!%%Q-!=   )sumlen)rows    r   r   z1find_next_best_element_position.<locals>.<lambda>%   s    c!=!==CH r   c                 &    | j                  dd      S )Nr   r   r   r   s    r   r   z1find_next_best_element_position.<locals>.<lambda>+   s    c1 r   r   widthc              3   @   K   | ]  }|j                  d d        ywr$   r   r%   s     r   r!   z2find_next_best_element_position.<locals>.<genexpr>2   s     4aAEE#qM4r&   c              3   f   K   | ])  }|j                  d d      |j                  dd      z    + ywr   r   r%   s     r   r!   z2find_next_best_element_position.<locals>.<genexpr>7   s*      VsAx1C!C Vs   /1)r   sortanyappendr(   r   r   )canvas_datamax_num_per_rowspacingr	   r   media_elementsrowselementplacedr)   last_rowrightmost_elementnew_xnew_ybottom_of_last_rowr   r   s                  @@r   find_next_best_element_positionr>      s    
 z2.H 55=<<QUU;EW 	
N 
  DE D! 
#KKQ'Xq)A	6 	Clhkll

7#	 KK	"
# 	IIHIIBxHMM-M.
8}&$RL!%%c1-0A0E0Egq0QQT[[4844 %<   VX VV"W,%<_s   E7-E2A E7)E7B5E7N)      )typingr   r   r   r   services.db_servicer   r>    r   r   <module>rD      s    - - *6r   