
    -ǚj                        d Z ddlmZ ddlZddlZddlmZ ddlmZm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ  ej2                  e      Z G d d      Zy)u  참조 이미지 생성 서비스 — ImageService에서 분리된 reference/composite 전용.

Phase 3b.2 (2026-04-18): ImageService의 참조/합성 관련 7개 메서드를 이관.
- generate_base_references (Phase 1 진입점, Phase 3b.4 신규)
- generate_composites (Phase 2+3 진입점, Phase 3b.4 신규)
- generate_reference_images_only (orchestrator 위임)
- generate_single_entity_image (단일 엔티티 참조 재생성)
- generate_composite_image (단일 composite 재생성)
- regenerate_composites_for_entity (엔티티 기준 composite 전체 재생성)
- _validate_reference (validator wrapper)

Phase 3b.5b (2026-04-18): ImageService wrapper 전부 제거.
호출자(api/v1/images.py, core/steps/image_steps.py)는 본 서비스를 직접 인스턴스화한다.

F24.4.1 (2026-04-24): generate_reference_images_only 본체를
`ReferencePipelineOrchestrator`로 literal lift. facade는 orchestrator.run()에
얇게 위임한다.
    )annotationsN)Path)AnyDictListOptional)Session)ActivityLogger)ImageValidator)ReferenceCompositeService)ReferenceEntityService)ReferencePipelineOrchestratorc                      e Zd ZdZ	 	 	 	 	 	 	 	 ddZddd	 	 	 	 	 	 	 ddZddd	 	 	 	 	 	 	 ddZ	 	 ddd		 	 	 	 	 	 	 	 	 dd
Z	 	 d	 	 	 	 	 	 	 ddZ	 	 d	 	 	 	 	 	 	 	 	 ddZ		 d	 	 	 	 	 ddZ
	 	 	 	 	 	 	 	 	 	 	 	 ddZy)ReferenceImageServiceu=   참조/합성 이미지 생성 전담 서비스 (Phase 3b.2).c                   || _         t        |      | _        || _        || _        t        |||| j                        | _        t        |||| j                        | _        t        |||| j                        | _
        y )N)db
project_idactor_idactivity_logger)_dbr
   _logger_project_id	_actor_idr   _entity_svcr   _composite_svcr   _pipeline_svc)selfr   r   r   s       Z/Users/manta/Documents/Projects/TheRoad-I1/backend/app/services/reference_image_service.py__init__zReferenceImageService.__init__(   s     %b)%!1! LL	
 8! LL	
 ;! LL	
    resumeN)modeipc               ,    | j                  |||d      S )u   엔티티별 base reference 이미지만 생성 (Phase 1).

        RefImageGenStep이 본 API로 호출. `skip_composite=True`를 강제하여
        Phase 1(reference)까지만 수행한다.
        Tr#   r"   skip_compositegenerate_reference_images_onlyr   
episode_idr"   r#   s       r   generate_base_referencesz.ReferenceImageService.generate_base_referencesI   s%     222D 3 
 	
r    c               ,    | j                  |||d      S )u\  composite(character + outlook) 이미지 생성 (Phase 2 + 3).

        Phase 1(base reference)는 resume 모드 덕에 이미 완료된 entity는 건너뛰며
        실제로 Phase 2(outfit 단독) + Phase 3(composite 전신) 단계만 수행한다.

        CompositeImageGenStep이 본 API로 호출. `skip_composite=False` 기본값.
        Fr%   r'   r)   s       r   generate_compositesz)ReferenceImageService.generate_compositesY   s%     222D 3 
 	
r    F)r&   c               @    | j                   j                  ||||      S )u}  엔티티 참조 이미지 생성 — orchestrator 위임 (F24.4.1).

        Phase 3b.4: 신규 호출자는 `generate_base_references` / `generate_composites`
        public API를 사용할 것. 본 함수는 기존 호출자(api/v1/images.py 및
        backend/scripts/experiment_*.py) 호환을 위해 `skip_composite` 플래그 시그니처로
        유지된다.
        r%   )r   run)r   r*   r#   r"   r&   s        r   r(   z4ReferenceImageService.generate_reference_images_onlyo   s+     !!%%2D & 
 	
r    c                >    | j                   j                  |||      S )N)custom_promptr#   )r   generate_single_entity_image)r   	entity_idr1   r#   s       r   r2   z2ReferenceImageService.generate_single_entity_image   s)     <<]r = 
 	
r    c                @    | j                   j                  ||||      S )N)r#   r*   )r   generate_composite_image)r   character_id
outlook_idr#   r*   s        r   r5   z.ReferenceImageService.generate_composite_image   s-     "";;*
 < D 	Dr    c                <    | j                   j                  ||      S )N)r#   )r    regenerate_composites_for_entity)r   r3   r#   s      r   r9   z6ReferenceImageService.regenerate_composites_for_entity   s!    
 ""CCIRTCUUr    c                   	 t        |      }|j                         sd d ||fS |j                         }|j                  ||      }|j	                  dd      }	t        j                  |d      }
|	dk  r1|j	                  dg       }|rdj                  |      nd}d	}d
|	 d| }t        j                  d|	|j	                  d             |	|
||fS # t        $ r&}t        j                  d|       d d ||fcY d }~S d }~ww xY w)Nscorer   F)ensure_ascii<   issuesz; zLow validation score	needs_fixz[auto-validation] score=z: z.Reference image validated: score=%d, passed=%spassedz%Reference image validation failed: %s)r   exists
read_bytesvalidate_reference_imagegetjsondumpsjoinloggerinfo	Exceptionwarning)r   	validator	file_pathentity_infostatusreview_notesfpimage_bytesresultr;   result_jsonr>   
issue_textexcs                 r   _validate_referencez)ReferenceImageService._validate_reference   s   	4iB99;T6<77--/K77[QFJJw*E**V%@KrzHb128TYYv.>T
$!9%:,OKKH%QWQ[Q[\dQef+v|;; 	4NNBCHv|33	4s#    C B,C 	C?C:4C?:C?)r   
OrmSessionr   strr   rY   returnNone)r*   rY   r"   rY   r#   Optional[str]rZ   Dict[str, Any])Nr!   )
r*   rY   r#   r\   r"   rY   r&   boolrZ   r]   )NN)r3   rY   r1   r\   r#   r\   rZ   r]   )
r6   rY   r7   rY   r#   r\   r*   r\   rZ   r]   )N)r3   rY   r#   r\   rZ   zList[Dict[str, Any]])rL   r   rM   rY   rN   r]   rO   rY   rP   rY   rZ   tuple)__name__
__module____qualname____doc__r   r+   r-   r(   r2   r5   r9   rW    r    r   r   r   %   s   G

 
 	

 

J  

 	

 
 

(  

 	

 
 

2 !	
  %

 
 	
 
 

4 (, 	

 %
 	

 

 !$(	D	D 	D 		D
 "	D 
	D !VV V 
	V4!4 4 $	4
 4 4 
4r    r   )rc   
__future__r   rE   loggingpathlibr   typingr   r   r   r   sqlalchemy.ormr	   rX   app.logging.activity_loggerr
   app.modules.image_validatorr   (app.services.reference_composite_servicer   %app.services.reference_entity_servicer   ,app.services.reference_pipeline_orchestratorr   	getLoggerr`   rH   r   rd   r    r   <module>rp      sN   $ #    , , 0 6 6 N H V			8	$Z4 Z4r    