
    x1j5                        d Z ddlmZ ddlmZmZmZmZ  eh d      Z	 eddh      Z
e	e
z  Z eh d      Z eh d      Z G d	 d
e      ZddZddZ	 	 	 	 	 	 	 	 ddZ	 d	 	 	 	 	 	 	 ddZdd	 	 	 	 	 	 	 ddZy)u  W19B-1: deterministic per-bg overlay payload builder.

``floor_plan_prompt`` (v6) 의 ``numbered_elements`` + ``camera_recommendations``
와 ``background_master_plan`` 의 backgrounds DAG 만으로 per-bg overlay payload
를 산출한다. LLM / image / VLM / DB / ImageAsset write 0.

Locked from Codex (W19B-1 review):
- production v6 는 ``unit_id`` 문자열을 emit 하지 않는다. 따라서 본 모듈은
  unit identity 를 ``base_structural_unit`` marker **number** 로만 본다.
- ``dominant_target_unit_marker_number`` 는 use 안에 ``base_structural_unit``
  marker 가 **정확히 하나** 일 때만 set. 그 외는 None + diagnostic.
- label / position_hint / sub_location / prose 기반 추론 금지 — 모든 join 은
  marker number / fp_id / bg_id exact integer 또는 exact string equality.
- unknown number, use/ignore overlap, missing camera, missing fp 모두 fail-closed.

Step (`FloorPlanOverlayPayloadStep`) 가 본 모듈을 호출 + checkpoint 직렬화.
본 모듈은 pure-function — 부수효과 없음, deterministic.
    )annotations)AnyDictListOptional>   base_openingbase_structural_unitbase_persistent_fixturebase_persistent_furniturestate_overlay_plot_cuestate_overlay_transient_object>   not_applicablepersistent_contextstructural_skeletonscene_essential_fixtures>   lowclearr   c                      e Zd ZdZy)FloorPlanOverlayPayloadErroru(   fail-closed: silent inference 회피용.N)__name__
__module____qualname____doc__     e/Users/manta/Documents/Projects/TheRoad-I1/backend/app/modules/pipeline/floor_plan_overlay_payload.pyr   r   8   s    2r   r   c                    | xs i j                  d      xs i }|j                         D ci c],  \  }}t        |t              r|j                  d      dk(  r||. c}}S c c}}w )Nfloor_plansstatusok)getitems
isinstancedict)fp_prompt_datafpsfidentrys       r   _index_floor_plansr)   <   sk    R
$
$]
3
9rC ))+%JCeT"uyy':d'B 	U
%  s   1A"c                |   g }| xs i j                  d      xs i }|j                         D ]  \  }}t        |t              r|j                  d      dk7  r+|j                  d      xs i }|j                  d      xs g D ]6  }t        |t              s|j                  d      s&|j	                  |       8  |S )Nplansr   r    planbackgroundsbg_id)r!   r"   r#   r$   append)master_plan_dataoutr+   _gidr(   r,   bgs          r   _collect_bg_specsr4   E   s     "C#((17RE{{}e%&%))H*=*Eyy &B((=)/R/B"d#w

2 0	 % Jr   c                  t        | t              st        d|d| d      g }t        |       D ]N  \  }}t        |t              st        |t
              st        d|d| d| d|d	      |j                  |       P |S )Nbg_id=z camera.z missing or not a list[z] is not an integer (got ))r#   listr   	enumerateboolintr/   )rawr.   fieldcoercedidxitems         r   _coerce_int_arrayrB   R   s     c4 *UIXeW,BC
 	
 Gs^	TdD!D#)>.	%# 7xq"  	t $ Nr   Nc           
        | |   }d}d}|rv|j                  dd      }|j                  dd      }|t        vr!t        d| d|dt        t                     |t        vr!t        d| d|dt        t                     ||j                  dd	      |j                  d
d	      |j                  dd	      |j                  dd	      ||dS )Nr   render_roletop_down_legibilitymarker #z render_role=z not in z top_down_legibility=label categoryposition_hintbase_layer_decision)numberrG   rI   rJ   rK   rD   rE   )r!   RENDER_ROLE_VALUESr   sortedTOP_DOWN_LEGIBILITY_VALUES)marker_by_numnummeta_for_markernerD   rE   s         r   _marker_entryrT   e   s   
 
s	B"K*%))-9IJ-11!#3
 00.3%}[O8,-.0  &@@.3%45H4K L !;<=? 
 $FF:r*4!vv&;R@"2 r   )marker_meta_by_fpc                    t        |       }t        |      }i }|D ]  }|d   }|j                  d      xs g }|s*|j                  dd      xs d}	|	dv r;t        d|d      |d   }
|j                  |
      }|t        d|d
|
d      i  |j                  d      xs g D ]+  }t	        |t
              rd|vr	 t        |d         }| |<   -  j                         D ]g  \  }}|j                  d      }t	        |t              st        d|
d| d|d      |t        vsEt        d|
d| d|dt        t                      d	}|j                  d      xs g D ]+  }t	        |t
              s|j                  d      |k(  s)|} n |t        d|d|
      t        |j                  d      |d      }t        |j                  d      |d      }t        |      }t        |      }||z  }|rt        d|dt        |             ||z  t               z
  }|rt        d|dt        |             g }|xs i j                  |
      xs i d&fd}g }g }t        |      D ]N  }t         | ||            }|d   }|t         v r|j#                  |       5|t$        v s>|j#                  |       P g }t        |      D ]U  }t         | ||            }|d   }|t$        v r|j#                  |       5|t         v s>|j#                  d| d|d       W t         fd |D              }t'        |      d!k(  r|d   }n+d	}|s|j#                  d"       n|j#                  d#| d$       ||
t        |      t        |      |||||t'        |      dk(  |d%||<    |S # t        t        f$ r Y w xY w)'ug  deterministic per-bg overlay payload.

    Returns: ``{bg_id: payload_dict}``. master_plan plans 순회 순서 보존.

    Per-bg payload shape (W19B-1 lock):
        bg_id, fp_id,
        use_numbered_elements (sorted), ignore_numbered_elements (sorted),
        base_markers_to_reference, transient_markers_to_describe,
        ignored_state_overlay_markers,
        target_unit_marker_numbers, dominant_target_unit_marker_number,
        clean_background_expected (bool), diagnostics (list[str]).

    Exact integer / string join only. label / position_hint / sub_location /
    prose 기반 추론 금지.
    r.   depends_on_fpsurface_roleinterior_room>   site_surfaceexterior_platetransition_zoner6   u1    has empty depends_on_fp — cannot resolve fp_idr   Nz depends_on_fp=zB not found in floor_plan_prompt.data.floor_plans (or status != ok)numbered_elementsrL   rK   zfp_id=z	 marker #z0 base_layer_decision missing or non-string (got r8   z base_layer_decision=z not in allowed enum camera_recommendationsz2 missing camera_recommendations entry under fp_id=use_numbered_elements)r.   r>   ignore_numbered_elementsu?    use_numbered_elements ∩ ignore_numbered_elements non-empty: z/ use/ignore references unknown marker numbers: c                ^    j                  |       xs j                  t        |             S N)r!   str)nfp_metas    r   	_meta_forz(build_overlay_payload.<locals>._meta_for   s%     ;;q>8W[[Q%88r   rF   z5 in ignore_numbered_elements is a base layer marker (z-); structural elements normally remain in usec              3  P   K   | ]  }|   j                  d       dk(  r|  yw)rK   r	   N)r!   ).0rQ   rP   s     r   	<genexpr>z(build_overlay_payload.<locals>.<genexpr>  s3      ,
S!%%&;<@VV s   #&   zfno base_structural_unit marker in use_numbered_elements; dominant_target_unit_marker_number left emptyz@multiple base_structural_unit markers in use_numbered_elements (u\   ); dominant_target_unit_marker_number left empty (W19B-1 lock — no lexical disambiguation))r.   fp_idr_   r`   base_markers_to_referencetransient_markers_to_describeignored_state_overlay_markerstarget_unit_marker_numbers"dominant_target_unit_marker_numberclean_background_expecteddiagnostics)rd   r<   returnOptional[Dict[str, Any]])r)   r4   r!   r   r#   r$   r<   	TypeError
ValueErrorr"   rc   ALL_LAYER_DECISIONSrN   rB   setrT   BASE_LAYER_DECISIONSr/   STATE_OVERLAY_DECISIONSlen)!r%   r0   rU   fp_indexbg_specsoutputr3   r.   dependsrX   rk   fp_entryrS   rQ   decisioncamcuse_listignore_listuse_set
ignore_setoverlapunknownrr   rf   rl   rm   r(   rn   ro   rp   re   rP   s!                                  @@r   build_overlay_payloadr      s   * ".1H !12H(*F7&&)/R66./BUoLTT
 .	!RS  
<<&.		 :G H 
 46,,239r9Bb$'82+="X,' "$M# : %**,GCvv34Hh,2UIYse 4**2Q8  222UIYse3Hl"71235  - )-67=2=A!T"quuW~'> > ;.	 "	# 
 %GG+,)

 (GG./,
 h-%
J&.	 "77=g6GI  Z'3}+==.	!P'?#% 
 "$
 %*//6<"	9 ;=!>@%'?C!-inEE23H//)00744-44U; # ?A%*%C!-inEE23H22-44U;11""se $'l + & &, ,
,
 &
" )*a/1KA1N.15.-""D
 ""23 4BB %+G_(.z(:)B-J-J*D2T),-J)Kq)P&
ue ~ ME z* s   N33OO)r%   Dict[str, Any]rs   Dict[str, Dict[str, Any]])r0   r   rs   zList[Dict[str, Any]])r=   r   r.   rc   r>   rc   rs   z	List[int]rb   )rP   zDict[int, Dict[str, Any]]rQ   r<   rR   rt   rs   r   )r%   r   r0   r   rU   z.Optional[Dict[str, Dict[int, Dict[str, Any]]]]rs   r   )r   
__future__r   typingr   r   r   r   	frozensetry   rz   rw   rM   rO   	Exceptionr   r)   r4   rB   rT   r   r   r   r   <module>r      s  $ # , , ! "   $$%   +-DD       ''IJ 39 3
	$', 15,	 . 	L IM	x"x %x F	x
 xr   