
    Vi`'                     H   d dl mZm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mZ d dlmZ d dlmZ d d	lmZ d d
lZd d
lZd d
lZ eddg          Z G d de          Z G d de          ZdedefdZe                    d          defd            Z e!                    d          defd            Z"e!                    d          defd            Z#e!                    d          defd            Z$e                    d          defd            Z%d
S )     )	APIRouterHTTPException)FileResponse)	BaseModel)get_summary_datagenerate_ai_analysis)update_a_part_status)loggerSTUDYPLAN_FILES_PATHget_gemini_model)classify_and_save)get_chat_logs)typesN Summary)prefixtagsc                       e Zd ZU eed<   dS )SummaryRequest
session_idN)__name__
__module____qualname__str__annotations__     "/app/app/routers/summary_router.pyr   r      s         OOOOOr   r   c                   2    e Zd ZU eed<   eed<   dZeed<   dS )AnswerSummaryRequestr   messageFcurriculum_shownN)r   r   r   r   r   r"   boolr   r   r   r    r       s5         OOOLLL"d"""""r   r    datareturnc                 F   g }|                      d          r|                    d| d                     |                      d          r|                    d| d                     |                      d          rK| d         }|                    d|                     dd           d	|                     d
d                      |                      d          ry| d         }|                    d|                     dd           d|                     dd           d|                     dd           d|                     dd                      |                      d          r|                    d| d                     |rd                    |          ndS )u*   프로필 데이터를 텍스트로 변환goalu   目標: mbtizMBTI: spiu   SPI: 言語=language_grade-u   , 非言語=nonverbal_grade	studyplanu   学習計画: 期間=durationu   , 週
study_daysu   日, weekday_hoursu   時間/日, 時間帯=	time_slotit_levelu   ITレベル: 
u   データなし)getappendjoin)r$   partsr)   sps       r   _build_profile_textr9      s   Exx 0.V..///xx .,d6l,,---xx s5kqCGG,<c$B$BqqPSPWPWXiknPoPoqqrrrxx 
+4BFF:s$;$; 4 4&&s++4 4vvos++4 4 S114 4	
 	
 	
 xx
 97T*%577888$;499U*;;r   z/status/{session_id}r   c                    K   	 t          |           }d|dS # t          $ r4}t          j        d|            dt	          |          i dcY d}~S d}~ww xY w)u8   分析結果ステータスのみ取得 (AI生成なし)successstatusr$   zSummary Status API Error: errorr=   r!   r$   N)r   	Exceptionr
   r>   r   )r   r$   es      r   get_summary_statusrB   7   s      B
++#T222 B B B5!55666!c!ffbAAAAAAAABs    
A)AAArequestc                   K   	 t          | j                  }t          |           d{V }||d<   t          | j        d           d|dS # t          $ r4}t          j        d|            dt          |          i dcY d}~S d}~ww xY w)	u!   기존 Summary API (하위호환)Nai_analysis   r;   r<   zSummary API Error: r>   r?   )r   r   r   r	   r@   r
   r>   r   )rC   r$   
ai_commentrA   s       r   get_summaryrH   A   s      B 233/55555555
(]W/333#T222 B B B.1..///!c!ffbAAAAAAAABs   AA 
B
)B?B
B
z/startc                 8  K   	 t          | j                  }t          |           d{V }||d<   d}t          j        d| j                    ||dS # t
          $ r:}t          j        d|            t          dt          |                    d}~ww xY w)	u!   サマリー開始（対話型）NrE   uD  ここまで事前の準備、本当にお疲れ様でした！いよいよ学習の準備が整いましたね😊|画面にあなたのプロフィール結果が表示されているので、確認してみてください！|この結果をもとに、あなた専用のカリキュラムを作成しましょうか？✨z"Summary Chat Started for session: )questionr$   zSummary Start Error:   status_codedetail)	r   r   r   r
   infor@   r>   r   r   )rC   r$   rG   greetingrA   s        r   start_summary_chatrQ   S   s      < 233/55555555
(] ZM9KMMNNN$d333 < < <0Q00111CFF;;;;<s   AA 
B5BBz/answerc                   K   	 t          | j        dd| j                   d{V  t          | j        d          }g }|dd         D ]L}|d         d	v r|d
         | j        k    r|d         d	v rdnd}|                    | d|d
                     M|                    d| j                    d                    |          }t          | j                  }t          |          }| j        rd}nd}d| d| d| d}	t                      }
|
j
                            d|	t          j        d                    }	 t          j        |j                  }n# t          j        $ r ddd}Y nw xY w|                    dd          }|                    dd          }t          | j        d d|           d{V  |d!k    r1t'          | j        d"           |                    d#d$          }d!||d%S |d&k    rd&|d'S d|d(S # t(          $ r:}t+          j        d)|            t/          d*t1          |          +          d}~ww xY w),u!   サマリー応答（対話型）MA)r   senderparttextNsummary)categoryirU   )rS   useruser_idlogUserBotz: zUser: r3   u  【現在のフェーズ: カリキュラム案内済み】
- 入力欄のキーボード（⌨️）からカリキュラムを確認するよう、ユーザーに案内した直後です。
- ユーザーが学習開始に同意（「はい」「始める」「やる」「移動する」等）→ status: "start_learning"
- ユーザーが「カリキュラムを見たい」「どうやって？」などと聞いた場合 → status: "continue"（「入力欄にあるキーボードボタン（⌨️）を押して、『カリキュラム』を選択してくださいね！」と優しく案内する）
- それ以外の雑談 → status: "continue"（短く応答して学習開始を促す）u  【現在のフェーズ: プロフィール確認中】
- ユーザーにプロフィールカードを表示し、カリキュラム作成を案内している段階です。
- ユーザーがカリキュラム作成に同意（「はい」「作って」「お願い」等）→ status: "completed"
- プロフィールへの質問や雑談 → status: "continue"（答えてからカリキュラム作成を再案内）u   あなたはGoalSkillの学習パートナー「トブ」です。
ユーザーのプロフィール分析結果を確認し、カリキュラム作成へ導く会話をしています。

【ユーザーのプロフィール情報】
z

u   

【現在の会話ログ】
u  

【応答フォーマット（JSON）】
- 通常: {"status": "continue", "answer": "応答文"}
- カリキュラム作成同意: {"status": "completed", "answer": "短い承認メッセージ", "followup": "PDF表示後のメッセージ。「あなた専用のカリキュラムが完成しました！」などの完了祝いと、必ず改行(\n)を挟み「このまま学習スペースへ移動して、さっそく勉強を始めてみますか？」と学習へ進むかを聞く質問を含めること"}
- 学習開始同意: {"status": "start_learning", "answer": "学習ページ移動の案内"}

【重要ルール】
- 過剰な称賛や不自然な共感は避ける
- 短くて自然な応答（2〜3文以内）
- 会話ログを確認し、同じ質問を繰り返さないzgemini-2.5-flashzapplication/json)response_mime_type)modelcontentsconfigcontinueua   すみません、うまく聞き取れませんでした。もう一度教えてください😊)r=   answerr=   rd   u.   もう少し詳しく教えてください😊I	completedrF   followupu   あなた専用のカリキュラムが完成しました！
このまま学習スペースへ移動して、さっそく勉強を始めてみますか？😊)r=   r!   rg   start_learning)r=   r!   )r=   rJ   zSummary Answer Error: rK   rL   )r   r   r!   r   r5   r6   r   r9   r"   r   modelsgenerate_contentr   GenerateContentConfigjsonloadsrW   JSONDecodeErrorr4   r	   r@   r
   r>   r   r   )rC   logshistory_linesr\   sender_namehistory_textr$   profile_textphase_instructionsystem_promptclientresponseresultr=   rd   rg   rA   s                    r   answer_summary_chatry   d   s>     R<7+=cPSZaZijjjjjjjjjj W/)DDD: 	A 	AC8} 888SZ7?=Z=Z$'M5M$M$M&&SXK  K!?!?3u:!?!?@@@@7go77888yy//   233*400 # 
	}!_!}
B 	B B B B B B B* "##=11$".BTUUU 2 
 
	[Z..FF# 	[ 	[ 	[ *  7Z  [  [FFF	[ Hj11H&VWW  7+=cPSZ`aaaaaaaaaa[   !3Q777zz*  /P  Q  QH)f(SSS'''.6BBB(f=== < < <1a11222CFF;;;;<sI   D=H E H E30H 2E33BH 7
H H 
I5IIz/curriculum/{session_id}c           	      T  K   	 t           j                            t          d|  d          }t	          j        d|  d|            t           j                            |          s+t	          j        d|            t          dd|            t	          j        d	|            d
dl	m
} d|  d} ||          }t          |ddd| d| i          S # t          $ r  t          $ r:}t	          j        d|            t          dt          |                    d}~ww xY w)u   커리큘럼 PDF 파일 서빙curriculum_z.pdfz#Curriculum PDF Request: session_id=z, path=zCurriculum PDF not found: i  z&Curriculum PDF not found for session: rL   zCurriculum PDF found: r   )quoteu   カリキュラム_zapplication/pdfzContent-Dispositionzinline; filename="z"; filename*=UTF-8'')
media_typeheaderszCurriculum PDF Error: rK   N)ospathr6   r   r
   rO   existsr>   r   urllib.parser|   r   r@   r   )r   pdf_pathr|   filenameencoded_filenamerA   s         r   get_curriculum_pdfr      s     <7<< 46TJ6T6T6TUUW*WWXWWXXXw~~h'' 	oL@h@@AAAC8mak8m8mnnnn7X77888&&&&&&9999 5??(%'v<L'v'vdt'v'v
 
 
 	
     < < <1a11222CFF;;;;<s   CC D'-5D""D')&fastapir   r   fastapi.responsesr   pydanticr   app.models.summary_moduler   r   app.models.general_moduler	   app.core.configr
   r   r   !app.services.goalskill_classifierr   app.models.chat_log_moduler   google.genair   r   rl   rerouterr   r    dictr   r9   r4   rB   postrH   rQ   ry   r   r   r   r   <module>r      s   , , , , , , , , * * * * * *       L L L L L L L L : : : : : : J J J J J J J J J J ? ? ? ? ? ? 4 4 4 4 4 4       				  					

 
 

    Y   # # # # #9 # # #<d <s < < < <6 "##B B B B $#B R
B~ 
B 
B 
B 
B" X<n < < < <  YT<'; T< T< T< T<v &''< < < < ('< < <r   