
    j*                       d Z ddlmZ ddlZ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 ddlmZ ddlmZmZ dd	lmZ  ej(                  e      Z ed
dg      Z ee      j3                         j4                  d   dz  Z ej8                         Z G d de      Z G d de      ZddZ 	 d	 	 	 	 	 	 	 ddZ!ejE                  de       ee      f	 dd       Z#ejI                  de       ee      f	 	 	 dd       Z%y)u  런타임 스틸 파이프라인 설정 API (2026-08-13 #108).

i2i 시네마틱 변환 스테이지(on/off)를 UI 에서 전환한다:
  · 프로세스 settings 즉시 반영 — 다음 스텝 실행부터 유효
    (스텝 config_hash 는 ON 일 때만 스탬프되는 관례 그대로).
  · backend/.env 영속 — 재기동 생존. 쓰기는 원자적(임시 파일→rename)
    이고 대상 키 한 줄만 바꾼다(다른 줄 byte 보존 — 추가 전용 관례).
    )annotationsN)Path)Optional)	APIRouterDepends)	BaseModel)get_current_userrequire_admin)settingsz/api/v1/settingsr   )prefixtags   z.envc                  :    e Zd ZU ded<   ded<   ded<   dZded<   y)	StillPipelineSettingsboolstill_cine_transform_enabledstrstill_image_backendcine_transform_packgrokstill_cine_providerN)__name__
__module____qualname____annotations__r        I/Users/manta/Documents/Projects/TheRoad-I1/backend/app/api/v1/settings.pyr   r   &   s!    "&&  &%r   r   c                      e Zd ZU ded<   y)StillPipelineUpdater   r   N)r   r   r   r   r   r   r   r    r    /   s    "&&r   r    c                     ddl m} m} t        t	        t        t        dd            t        t        t        dd             | |              t        t        t        dd            	      S )
Nr   cine_pack_selectorresolve_prompt_versionr   Fr   nb2r   r   )r   r   r   r   )!app.modules.pipeline.still_reciper#   r$   r   r   getattrr   r   r"   s     r   	_snapshotr(   3   sd    
 !%)H<eD&FH3U;=
 33E3GHH3V<> r   c                   |xs t         }|j                         st        d| d      |j                  d      j	                  d      }t        j                  dt        j                  |        d      }g }d	}|D ]>  }|j                  |      r|j                  |  d| d
       d}.|j                  |       @ |s:|r!|d   j                  d
      s|dxx   d
z  cc<   |j                  |  d| d
       |j                  |j                  dz   z  }	|	j                  dj                  |      d       |	j                  |       y)uJ  .env 의 `KEY=` 줄만 교체(전부)·없으면 끝에 추가 — 원자 쓰기.

    다른 줄은 byte 그대로 보존한다. 파일 부재 시 새로 만들지 않고
    RuntimeError — 운영 .env 가 있어야 할 자리에 없다는 것은 배선
    사고라 조용히 새 파일을 만들면 원인이 숨는다.
    u   .env 가 없다: u    — 영속 대상 부재zutf-8)encodingT)keepends^=F
z.tmp N)	_ENV_PATHexistsRuntimeError	read_text
splitlinesrecompileescapematchappendendswithparentname
write_textjoinreplace)
keyvalueenv_pathpathlinespatoutreplacedlntmps
             r   persist_env_flagrK   G   s-     yD;;=.tf4MNOONNGN,777FE
**"))C.)+
,C
CH99R=JJ#awb)*HJJrN  s2w''-GtOG

cU!E7"%&
++V+
,CNN2773<'N2KKr   z/still-pipeline)response_modelc                    t               S N)r(   )_users    r   get_still_pipeline_settingsrP   f   s     ;r   c                    t        | j                        }t        5  t        d|rdnd       |t        _        d d d        t
        j                  d|       t               S # 1 sw Y   )xY w)NSTILL_CINE_TRANSFORM_ENABLEDtruefalseuB   settings: still_cine_transform_enabled=%s (UI 토글, .env 영속))r   r   _TOGGLE_LOCKrK   r   loggerinfor(   )bodyrO   enableds      r   update_still_pipeline_settingsrZ   m   s^     4445G
 
*gF7	L07- 
 KKL ; 
s   A  A))returnr   rN   )rA   r   rB   r   rC   zOptional[Path]r[   None)rX   r    r[   r   )&__doc__
__future__r   loggingr6   	threadingpathlibr   typingr   fastapir   r   pydanticr   app.api.depsr	   r
   app.core.configr   	getLoggerr   rV   router__file__resolveparentsr1   LockrU   r   r    r(   rK   getrP   putrZ   r   r   r   <module>ro      s;   #  	    &  8 $			8	$	,J<	@ N""$,,Q/&8	 y~~&I &') '* 6:	$2	> .CD
"
# E .CD
 -
 	

  Er   