
    Oj                     d   d Z ddlmZmZmZmZmZmZ eeef   Z	deee
ef      deee	      fdZdeee
ef      dee	e
f   fdZde	d	eee	      defd
Zdee
   deee
f   dee	e
f   d	eee	      dee   f
dZdeee
ef      dee   dee
   deee
f   dee	e
f   d	eee	      deee
ef      fdZy)u+  W22 야외 직행 체인 공용 헬퍼 — 선택 샷/loc 매핑 (스텝 간 드리프트 방지).

outdoor_place_spec(①)과 outdoor_shot_grounding(③)이 동일한 규칙으로
"그룹 관련 선택 샷"을 골라야 한다 (Codex W1 NARROW_1 계약):
  - shot_selection 기준 선택 샷만 (staging cp 는 생성 시점 선택이라
    토글 해제 잔존 가능 → 현재 선택으로 재필터)
  - 샷 location_id ∈ 그룹 loc / location_id 없으면 scene primary 로 판정
  - 미선택 샷의 location 은 씬 매핑을 만들지 않음
    )AnyDictListOptionalSetTupleselection_cpreturnc                 *   | xs i j                  di       j                  dg       xs g }|syt               }|D ]V  }|j                  d      }||j                  dg       xs g D ]'  }|j                  t        |      t        |      f       ) X |S )u\   shot_selection cp → 선택 샷 키 집합. cp 부재/빈 데이터면 None(필터 없음).datascenesNscene_indexselected_shot_indices)getsetaddint)r	   
sel_sceneskeysscsishis         `/Users/manta/Documents/Projects/TheRoad-I1/backend/app/modules/pipeline/outdoor_direct_common.pybuild_selected_keysr      s     $"))&"599(BGM2JDVVM":66126<"<CHHc"gs3x() =	  K    validator_cpc                 F   i }| xs i j                  di       j                  dg       xs g D ]q  }|j                  d      }||j                  dg       xs g D ]B  }|j                  d      }||j                  d      xs d|t        |      t        |      f<   D s |S )uL   shot_validator cp → (scene_index, shot_index) → location_id ('' 허용).r   r   r   shots
shot_indexlocation_id )r   r   )r   outr   r   shr   s         r   build_shot_loc_mapr$   !   s     !C!r&&vr266xDJJVVM":&&"%++B&&&C{')vvm'<'BCR#c(#$	 ,	 K Jr   keyselected_keysc                     |d u xs | |v S )N )r%   r&   s     r   is_selectedr)   2   s    D 8C=$88r   loc_idsscene_primaryshot_loc_by_keyc                     |j                         D ch c]  \  }}|| v s| }}}|j                         D ].  \  }}|s	|| v st        ||      s|j                  |d          0 t        |      S c c}}w )uT   loc 집합이 등장하는 scene_index — scene primary + 선택 샷 loc 합집합.r   )itemsr)   r   sorted)r*   r+   r,   r&   r   lidr"   r%   s           r   scene_indices_for_locsr1   6   sw     +002
E2'"ccWn22C
E#))+S3'>k#}&EGGCFO , #;	 Fs
   A4A4staging_shotsscene_indicesc                t   t        |      }g }| xs g D ]  }|j                  d      }	|j                  d      }
|	|vs|
,t        |	      t        |
      f}t        ||      sO|j                  |d      }|r||v sh|j	                  |       z|j                  |d         |v s|j	                  |        |S )u   그룹 관련 선택 샷만 — staging×validator (si,shi) join.

    location_id 있으면 그룹 loc 일 때만, 없으면 scene primary 가 그룹 loc
    일 때만 포함.
    r   r   r!   r   )r   r   r   r)   append)r2   r3   r*   r+   r,   r&   si_setr"   r#   sh_sish_shir%   r0   s                r   filter_group_shotsr9   D   s     F "C!r!}%%&.5z3v;'3.!!#r*g~

2s1v&'1JJrN " Jr   N)__doc__typingr   r   r   r   r   r   r   ShotKeystrr   r$   boolr)   r1   r9   r(   r   r   <module>r?      sr   9 8
S/4S>*c'l"4S>*	'3,"9W 9Xc'l-C 9 9XS> '3,' CL)	
 
#YS#X' 9 X	
 S> '3,' CL) 
$sCx.r   