
    jU                         d Z ddlZddlZddlmZmZ ddlmZ ddlm	Z	 ddl
mZ  ej                  e      Ze G d d             Zdd	ed
edefdZy)uH  기획서 분석 결과를 파이프라인 step 프롬프트에 주입하는 헬퍼.

사용법:
    from app.core.planning_doc_context import get_planning_context
    ctx = get_planning_context(project_id, episode_id, self.db)
    if ctx.characters_text:
        prompt += f"

## 기획서 인물 정보
{ctx.characters_text}"
    N)	dataclassfield)Path)Optional)settingsc                       e Zd ZU dZdZeed<   dZeed<   dZe	ed<   dZ
e	ed<   dZe	ed<   dZe	ed	<   dZe	ed
<   dZe	ed<   dZe	ed<    ee      Zeed<   dde	de	de	fdZy)PlanningContextu8   기획서에서 추출된 주입 가능한 컨텍스트.Fhas_planning_docis_first_episode characters_textlocations_textworld_setting	tone_mood	story_arcvisual_conceptsrelationships_text)default_factoryavailable_sectionssectionheaderreturnc                     |dk(  r| j                   sy|dk(  r| j                   syt        | |d      }|sy|xs d| }d| d| dS )u   섹션이 있으면 헤더+내용 반환, 없으면 빈 문자열.

        첫 에피소드만 주입하는 섹션(characters)은 is_first_episode 체크.
        r   r   r   u   ## 기획서 참고: z

z
<planning_doc_reference>
z
</planning_doc_reference>)r   getattr)selfr   r   valhdrs        S/Users/manta/Documents/Projects/TheRoad-I1/backend/app/core/planning_doc_context.pyinject_if_availablez#PlanningContext.inject_if_available)   sq     ''0E0E**43H3HdGR(9/y93% )),-HJ	
    N)r   )__name__
__module____qualname____doc__r
   bool__annotations__r   r   strr   r   r   r   r   r   r   listr   r    r    r   r	   r	      s    B"d""d" OS NCM3IsIsOS    %T::
3 
 
S 
r    r	   
project_id
episode_idr   c                 h   t               }ddlm}  || |      }|t        t        j
                        | z  dz  dz  }d}||z  dz  dz  }|j                         r|}nJ|j                         r:t        |j                               D ]  }	|	dz  dz  }
|
j                         s|
} n ||S 	 t        j                  |j                  d	
            }t        |t               r|j#                  d|      nd}t        |t               s|S |j#                  dg       }|s|S d|_        ||_        ddlm} d}|ddlm}  |       }d}	 |j1                  |      j3                  |j4                  | k(        j7                  |j8                        j;                         }|r|d   j<                  |k(  rd|_        |r|jA                          	 |j#                  dg       }|rd|v rg }|D ]  }d|d    dg}|j#                  d      r|jC                  d|d    d       |j#                  d      r|jC                  d|d    d       |jC                  d|d           |j#                  d      r|jC                  d|d           |jC                  d jE                  |              d!jE                  |      |_#        |j#                  d"g       }|r|d"|v rxg }|D ][  }d|d    dd|d    g}|j#                  d      r|jC                  d|d           |jC                  d jE                  |             ] d!jE                  |      |_$        d#|v r|j#                  d#d$      |_%        d%|v r|j#                  d%d$      |_&        d&|v r|j#                  d&d$      |_'        d'|v r|j#                  d'd$      |_(        |j#                  d(g       }|r!d(|v rd!jE                  d) |D              |_)        |S # t        $ r"}t        j                  d|       |cY d}~S d}~ww xY w# |r|jA                          w w xY w)*u  프로젝트의 기획서 분석 체크포인트를 로드하여 PlanningContext 반환.

    Lookup 순서:
      1. project-level: ``planning_doc_analysis_service.load_project_checkpoint``
         (L4 source_hash 검증 통과한 데이터만 — stale resurrection 차단).
      2. legacy episode-level: ``checkpoints/episodes/{eid}/planning_doc_analysis/manifest.json``
         (구 PlanningDocAnalysisStep cascade 산물 — 옛 schema, raw read OK).

    db: 호출자의 SQLAlchemy 세션. None이면 새 세션 생성.
    r   )load_project_checkpoint)dbNcheckpointsepisodesplanning_doc_analysiszmanifest.jsonzutf-8)encodingz1Failed to load legacy planning doc checkpoint: %sdatar   T)EpisodeF)SessionLocal
charactersz- **namez**
age_gender()role[]: descriptionvisual_traitsu   
  외형:  
	locationsr   r   r   r   r   key_relationshipsc              3   8   K   | ]  }d |d    d|d      yw)z- r6   r>   relationshipNr)   ).0rs     r   	<genexpr>z'get_planning_context.<locals>.<genexpr>   s,      +
AEAb<!An$5#67s   )*r	   *app.services.planning_doc_analysis_servicer-   r   r   projects_direxistssortediterdirjsonloads	read_text	Exceptionloggerwarning
isinstancedictgetr
   r   app.models.projectr4   app.core.databaser5   queryfilterr*   order_byepisode_numberallidr   closeappendjoinr   r   r   r   r   r   r   )r*   r+   r.   ctxr-   r3   base	legacy_cpep_cpep_diraltrawexc	availabler4   should_closer5   r0   r6   linescpartsrC   locrelss                            r   get_planning_contextrr   >   s=    
C S2:"ED |&&'  	 %)	z!$;;oM<<>I[[] 066H::< #I	 1
 J	**Y00'0BCC (2#t'<swwvs#$dD!
-r2I
C&C +L	z2^HHWVG&&*45Xg,,-SU	 	 *4#'C HHJ ,+Jli/AAfI;b)*Euu\"q< 134uuV}q61-.LL2a./01uu_%|Ao,>+?@ALL%)  #ii. b)I[I-CCK=+r#m2D1E-FGEww'|C,@+ABCLL%)	 
 "YYu- )# HH_b9ib1ib1I%"hh'8"= 88',D#y0!% +
AE+
 "
 J_  	NNNPSTJ	@ HHJ s+   .%O. A/P .	P7PPPP1)N)r$   rO   loggingdataclassesr   r   pathlibr   typingr   app.core.configr   	getLoggerr!   rS   r	   r'   rr   r)   r    r   <module>ry      sh      (   $			8	$ %
 %
 %
PvS vc v vr    