
    ҭj                    h    d Z ddlmZ ddlmZ ddlmZmZmZm	Z	 dZ
	 	 	 	 	 	 d
dZ	 	 	 	 ddZddZy	)u  상태 변형(쓰러짐·의식 없음·죽음)의 **입력 그림**을 고른다 — 한 자리 (2026-09-20).

실측(컨트리로드 2판): 상태 변형 단계가 「그 인물의 가장 최근 합성」을 입력으로 써서
찰리(로봇)의 의식 없음·죽음 변형이 **외투를 입고** 만들어졌다 — 그 상태가 나오는
샷 5개에서 찰리는 옷이 없다(O00·배정 없음). 상태 변형은 합성보다 먼저 붙으므로
(state_variant > 의상 합성 > 기본) 그 샷에 틀린 옷이 실린다. 현우 의식 없음도 O02
에서 만들어졌는데 쓰는 샷은 O01 이었다.

규칙: 그 (인물, 상태)가 나오는 **선택 샷**에서 그 인물에게 **명시로 배정된** 옷을 센다.
- 옷 없음(O00)이 다수 → 기본 그림(`BASE`)
- 한 옷이 다수 → 그 옷(아웃룩 id) — 그 옷의 합성에서 만든다
- 동수·명시 배정 없음 → None — 종전 규칙(가장 최근 합성)으로 둔다
★「배정 없음」은 **표를 던지지 않는다** — 그 샷에서 무슨 옷인지 모르는 것을
 「옷 없음」으로 세면, 옷이 명시된 샷을 이긴다(실측: 현우 중상 — 배정 없음 3 ·
 O02 2 → 기본 그림으로 바뀌어 O02 샷 둘에 틀린 옷이 실릴 뻔했다).
    )annotations)Counter)AnyIterableOptionalSet__base__c                    t               }| D ]  }|s|||v rt        n|xx   dz  cc<    |sy|j                         }t        |      dkD  r|d   d   |d   d   k(  ry|d   d   S )uh   샷별 배정 옷(아웃룩 id, 없으면 None) → `BASE` | 아웃룩 id | None(동수·재료 없음).   Nr   )r   BASEmost_commonlen)outlooks_in_shotso00_idsvotesoltops        S/Users/manta/Documents/Projects/TheRoad-I1/backend/app/core/state_variant_source.pypick_state_variant_sourcer      s|     YEbGmd,1,   



C
3x!|Aq	SVAY.q6!9    c                  	 |yddl m	 ddlm} | j	                  |      j                  |j                  |k(  |j                  |k(  |j                  dk(  |j                  dk(  |j                  j                  d       |j                  j                  d       |j                  j                  d	             j                         }|t        k(  r|S | j	                  |      j                  |j                  |k(  |j                  dk(  |j                  j                  d
| d| d            j                         }|sy||j                  ndd	fd}t!        ||      d   S )u/  `pick_state_variant_source` 의 답 → 입력으로 쓸 ImageAsset (없으면 None).

    - `BASE` → 그 인물의 대표 기본 그림(합성·아웃룩·상태 변형 제외)
    - 아웃룩 id → 그 (인물, 옷) 합성 중 **지금 기본 그림으로 그린 것**, 없으면 가장 최근
    Nr   )	parse_iso)
ImageAsset	referencer   z[composite:%z[outlook_id:%z[state_variant%z[composite::% c                    rd d| j                   xs dv rdnd} t        | dd             }||r|j                          fS d fS )Nr   ]r   r   r   
created_at)prompt_usedgetattr	timestamp)atiertscurr   s      r   _rankzsource_asset_for.<locals>._rankN   sX    auAJ1==+>B?qQwq,56"455!455r   )key)r$   r   )app.core.step_lockr   app.models.projectr   queryfilter
project_id	entity_id
asset_type
is_primaryr!   likefirstr   allidsorted)
dbr.   char_idwantr   baserowsr(   r'   r   s
           @@r   source_asset_forr<   *   sY    |,- 		
%%3$$/%%4%%*'',,^<<'',,_=='',,->??
A 
 	 t|
	
%%3%%4&&++k'!D6,KL
N 
 	 %$''2C6 $E"1%%r   c                    ddl }|sy	 t        | t              r|j                  |       nt	        | xs g       }|r|d   nd}t        |      xr ||k7  S # t
        t        f$ r Y yw xY w)u  이미 있는 상태 변형의 입력(`input_image_ids` 첫 칸)이 지금 규칙이 고른 입력과
    **다르면** True — 내리고 다시 만든다. 규칙이 못 골랐거나(None) 옛 자산에 입력
    기록이 없으면 False(모르는 것을 다시 사지 않는다).r   NF)json
isinstancestrloadslist	TypeError
ValueErrorbool)existing_input_idswant_source_id_jsonidsr3   s        r   existing_source_differsrJ   W   sy     2<=OQT2Uu{{-.+1r2 	 CFtE;25N22 z" s   0A A&%A&N)r   zIterable[Optional[str]]r   zSet[str]returnOptional[str])
r7   r   r.   r@   r8   r@   r9   rL   rK   r   )rF   r   rG   rL   rK   rE   )__doc__
__future__r   collectionsr   typingr   r   r   r   r   r   r<   rJ    r   r   <module>rR      sU     #  / /.9A"*&(*&-0*&Z3r   