
    >j                         d Z ddlZddlmZmZ ddlmZ ddl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 ddlmZmZmZmZ ddlmZmZmZ de fdZ!de fdZ" G d d      Z#y)u   ImageUploadService — 사용자 이미지 업로드 서비스 (W5 F23 Phase 4).

ImageService facade(image_service.py)에서 upload_custom_image를
literal lift. facade는 얇은 delegate만 유지.
    N)datetimetimezone)Path)AnyDictOptional)Session)settings)AppError)to_relative_image_path)t)ActivityLogger)EntityCanonEntityEpisodeLink
ImageAsset
SceneStill)MANUAL_UPLOAD_PROMPTauto_set_primaryimage_to_dictreturnc                  d    t        j                  t        j                        j	                         S N)r   nowr   utc	isoformat     W/Users/manta/Documents/Projects/TheRoad-I1/backend/app/services/image_upload_service.py_nowr      s    <<%//11r   c                  <    t        t        j                               S r   )struuiduuid4r   r   r   _new_idr$      s    tzz|r   c                   |    e Zd ZdZdededededdf
dZ	 	 	 	 dd	ed
ede	e   de	e   de	e   de	e   de
eef   fdZy)ImageUploadServiceu(   사용자 이미지 업로드 서비스.db
project_idactor_idactivity_loggerr   Nc                 <    || _         || _        || _        || _        y r   )_db_project_id	_actor_id_logger)selfr'   r(   r)   r*   s        r   __init__zImageUploadService.__init__&   s!     %!&r   
file_bytesfilename	entity_idstill_id
episode_idipc                 Z   |r| j                   j                  t              j                  t        j                  |k(  t        j
                  | j                  k(        j                         }|st        dt        d      d      |r| j                   j                  t              j                  t        j                  |k(  t        j
                  | j                  k(        j                         }|st        dt        d      d      |rdnd}|s|r^| j                   j                  t              j                  t        j                  |k(        j                         }	|	r|	j                  nd}nb|r^| j                   j                  t              j                  t        j                  |k(        j                         }
|
r|
j                  nd}nd}t        t        j                         | j                  z  }|rdnd}|d	z  |z  |z  }|j#                  d
d
       t%               }t        |      j&                  xs d}|| | z  }|j)                  |       t+        || j                  ||||t-        |      t.        dddddt1                     }| j                   j3                  |       t5        | j                   | j                  |       | j                   j7                          | j8                  j;                  | j<                  dd|| j                  |||d|       t?        |      S )z;Upload a custom image file and create an ImageAsset record.zimage.entity_not_foundzimage.not_foundi  )codemessagestatus_codezimage.still_not_found	referencescenesharedimagesT)parentsexist_okz.pngmanual_uploadN	generated )idr(   
asset_typer4   r5   r6   	file_pathprompt_usedgeneration_modelwidthheightstatusreview_notes
created_atzimage.uploadimage)r4   r5   r3   )r)   actionresource_typeresource_idr(   detail
ip_address) r,   queryr   filterrE   r(   r-   firstr   r   r   r   canon_idr6   r   r
   projects_dirmkdirr$   suffixwrite_bytesr   r   r   r   addr   commitr/   logr.   r   )r0   r2   r3   r4   r5   r6   r7   owner_checkrF   linkstillproject_dirsub_dir
images_dirimage_idextrG   assets                     r   upload_custom_imagez&ImageUploadService.upload_custom_image2   s    {+)3[5K5KtO_O_5_` 
 1/0 # 
 z*
1:3H3HDL\L\3\] 
 0/0 #  %.[7
 HHNN#45V-66)CDUW 
 15T__(
HHNN:.VJMMX56UW 
 27U--H
%
 8001D4D4DD!*+ 8+j87B
598n##-vH:cU!33	j)''!!,Y7 -,v!
$ 	U4#3#3U;^^!! ''!*hW 	 	
 U##r   )NNNN)__name__
__module____qualname____doc__
OrmSessionr!   r   r1   bytesr   r   r   ri   r   r   r   r&   r&   #   s    2
'
' 
' 	
'
 (
' 

'  $("&$( e$e$ e$ C=	e$
 3-e$ SMe$ SMe$ 
c3he$r   r&   )$rm   r"   r   r   pathlibr   typingr   r   r   sqlalchemy.ormr	   rn   app.core.configr
   app.core.errorsr   app.core.file_pathsr   app.i18n.loaderr   app.logging.activity_loggerr   app.models.projectr   r   r   r   "app.services.image_service_helpersr   r   r   r!   r   r$   r&   r   r   r   <module>rz      sa     '  & & 0 $ $ 6  6 U U 2c 2 t$ t$r   