o
    i                     @   sH  d dl Zd dlZd dlmZ d dlmZ d dlmZ d dlm	Z	m
Z
 d dlmZmZmZmZmZmZmZmZmZmZ e	dZe	dZd	d
 Zdd Zdd ZdefddZdefddZdefddZdefddZdefddZdefddZ defddZ!defdd Z"defd!d"Z#d#e$fd$d%Z%defd&d'Z&d#e$fd(d)Z'dS )*    N)types)datetime)logger)get_db_configgenai_client)
CheckInRequestMorningAssessmentRequestMorningReflectionRequestEndDayRequestSubmitSalesReportRequestBossCommentRequestCounselingRequestFinalReviewAnalysisRequestSubmitFinalReviewRequestFinishCounselingRequest
Sales_B_DB
Sales_C_DBc                   C      t jjdi tS N )mysql	connectorconnectB_DB_CONFIGr   r   r   >/home/air/goalskill_sales/back/app/models/today_goal_module.pyget_db_connection      r   c                   C   r   r   )r   r   r   C_DB_CONFIGr   r   r   r   get_c_db_connection   r   r   c           
   
   C   s   d}d}zfz6t  }| }d| d}|D ]}t|d }|d }||||| |f q|  td| d|   W n tyY }	 ztd| d	t|	  W Y d}	~	nd}	~	ww W |ra|  |ri|  dS dS |rq|  |rx|  w w )
u   
    goals 리스트의 current 값으로 Sales_C_DB를 업데이트합니다.
    단, achievement_rate(달성률)은 Sales_C_DB 테이블에 이미 저장된 'target' 값을 기준으로 계산합니다.
    Nz
            UPDATE z
            SET achievement = %s, 
                achievement_rate = IF(target > 0, ROUND((%s / target) * 100), 0)
            WHERE session_id = %s AND category = %s
        current_countcategoryzDEBUG: Updated z using DB targets for session zError updating Sales_C_DB (z): )	r   cursorfloatexecutecommitprint	Exceptionstrclose)

session_idgoals
table_nameconnr!   
update_sqlgcurrentr    er   r   r   update_sales_c_dbA   s.   $r1   checkin_datac              
   C   sr  | j dd}zz|d|jf | }|std|jdk}d}|||j|j||j|jf t|d }||j }|d||jf | 	  |d	 r[t|d	 dkr[t|d	 }nt|d
 }dd }	|rd}
|	|j}|	|}|	|}d| d| |d  d}d| |d  d| d}nd}
d}d||
|dW W |
  S  ty } z|   |d }~ww |
  w )NT
dictionaryz!SELECT * FROM goals WHERE id = %su!   目標が見つかりません。r   z
            INSERT INTO check_in_logs (goal_id, increment_count, is_success, user_mood, session_type) 
            VALUES (%s, %s, %s, %s, %s)
        r   z1UPDATE goals SET current_count = %s WHERE id = %sadjusted_target_countoriginal_target_countc                 S   s   |   rt| S | S )N)
is_integerint)numr   r   r   fmt   s   z"process_30min_checkin.<locals>.fmtPRAISEu	   (累計: /unit)u   お疲れ様です！30分でu   進みましたね。u)    この調子でいきましょう！🔥
COUNSELINGun   実績なしですね。ということですが、焦らずいきましょう。次の30分で挽回です！success)status
is_successai_modemessage)r!   r#   goal_idfetchone
ValueErrorincrement_count	user_moodsession_typer"   r$   r(   r&   rollback)db_connr2   r!   goalrB   insert_log_sqlcurrent_db_valnew_current_countdisplay_targetr:   rC   formatted_incformatted_currformatted_targetprogress_inforD   r0   r   r   r   process_30min_checkinm   s^   
	




rV   request_datac              
   C   sD  | j dd}zz |d|jf | }|stdg }d}d}|D ]0}t|d }t|d }	||7 }||	7 }|dkrFt|	| d	 nd}
||d
 |	||
d q$|dkr\d}nt|| d	 }g }d}d}d}|dkrd}d| d}d}|D ]}|d|d |d f q|nId}d| d}d}|D ]<}t|d }t|d }	|	|kr|}n||	 }t|	| d}|d||d f ||kr||d |d ||d qd}|||||jf | 	  |d|jf |
 }|rt|d |d ||||||dW W |  S  ty } z|   |d }~ww |  w )NTr3   &SELECT * FROM goals WHERE plan_id = %su'   評価する目標はありません。        r6   r   r   d   titler[   r/   targetrateHIGH (   u   全達成率 uQ   %. 素晴らしいペースです！各項目も順調に進んでいますね。ux   現在のペースが良いので、午後の目標はそのまま維持します。このまま完走しましょう！z9UPDATE goals SET adjusted_target_count = %s WHERE id = %sidLOWuE   %. 目標に対して少し遅れている項目が見られます。uu   負担を減らして完走できるよう、未達成の項目を中心に目標を現実的に調整しました。   r    )rE   r    original_targetadjusted_targetz
            UPDATE daily_plans 
            SET morning_motivation_score = %s, ai_feedback_summary = %s 
            WHERE id = %s
        0SELECT session_id FROM daily_plans WHERE id = %sr)   today_sales_am_daily)motivation_levelscore
ai_summaryafternoon_actionadjusted_goals	breakdown)r!   r#   plan_idfetchallrG   r"   r8   appendroundr$   rF   r1   r(   r&   rK   )rL   rW   r!   r*   breakdown_listtotal_original_targettotal_current_countr.   originalr/   r^   rj   adjusted_goals_listri   rk   rl   rM   
new_target	remainingupdate_query	plan_infor0   r   r   r   evaluate_morning_motivation   s   



r|   c              
   C   st   | j dd}z.zd}|||j|jf |   dddW W |  S  ty4 } z|   |d }~ww |  w )NTr3   z9UPDATE daily_plans SET user_reflection = %s WHERE id = %su   保存されました。u   率直な振り返り、ありがとうございました。 記録していただいた悩みは、より良い成果のための土台になります。 午後も応援します！💪)rD   	ai_advice)r!   r#   reflection_textro   r$   r(   r&   rK   )rL   rW   r!   r-   r0   r   r   r   save_morning_reflection(  s   
	
r   c              
   C   s  | j dd}zz|d|jf | }|stdg }d}d}g }|D ]e}|d dkr2t|d nt|d }	t|d	 }
||	7 }||
7 }|	dkrRt|
|	 d
 nd}||d |
|	|d | }|
	 rlt|
n|
|d	< tt|d |d< tt|d |d< || q$|dkrt|| d
 nd}|d|jf | 
  |d|jf | }|rt|d |d |d
krd}n	|dkrd}nd}||||dW W |  S  ty } z|   |d }~ww |  w )NTr3   rX   zData Not FoundrY   r5   r   r6   r   rZ   r[   r\   u<   UPDATE daily_plans SET total_status = '完了' WHERE id = %srg   r)   today_sales_pm_dailyu^   本当にお疲れ様でした！目標完全達成、素晴らしい一日でしたね！🎉P   uj   お疲れ様でした！今日も一日よく頑張りました。ゆっくり休んでください。🍵um   お疲れ様でした。今日は少し大変でしたか？明日はきっと良い日になります！💪)final_scorerD   rn   r*   )r!   r#   ro   rp   rG   r"   r8   rq   copyr7   r$   rF   r1   r(   r&   rK   )rL   rW   r!   r*   rs   total_targettotal_currentupdated_goalsr.   
target_valcurrent_valr^   g_copyr   r{   msgr0   r   r   r   finish_day_and_get_report>  sl   $

r   c              
   C   s   | j dd}z@z-d}|||j|j|jf |   |jdkr*dddW W |  S dd	dW W |  S  tyF } z| 	  |d }~ww |  w )
NTr3   z|
            UPDATE daily_plans 
            SET boss_comment = %s 
            WHERE session_id = %s AND date = %s
        r   erroru?   該当日付のレポートは見つかりませんでした。rA   rD   r@   u0   フィードバックが保存されました。)
r!   r#   boss_commentr)   dater$   rowcountr(   r&   rK   rL   rW   r!   sqlr0   r   r   r   save_boss_comment  s(   



r   c              
   C   s   | j dd}zIz6d}|jD ]}|jr%|j r%|||j|j|j|jf qd}|||jf |   ddiW W |	  S  t
yO } z|   |d }~ww |	  w )NTr3   z
            INSERT INTO sales_report_reflections (plan_id, goal_id, reflection_text, session_id)
            VALUES (%s, %s, %s, %s)
        z<UPDATE daily_plans SET is_report_submitted = 1 WHERE id = %srD   u3   各項目の振り返りを保存しました。✅)r!   reflectionsr~   stripr#   ro   rE   r)   r$   r(   r&   rK   )rL   rW   r!   
insert_sqlitemr-   r0   r   r   r   save_sales_report  s.   



r   c              
   C   s^  | j dd}t d}d}zz|||jd|jf |   d }|jr3|d|jf |	 }|sDd}|||j|f |	 }d}|r|d	|d
 f |
 }g }	|D ]%}
|
d dkre|
d n|
d }|	|
d  d|
d  d| |
d   qYd|	}d| d}d}|||j|f |
 }d}|D ]}|d dkrdnd}|| d|d  d7 }qd}z*td u rtdd| d}tjjd d!|j d"tj|d#d$d%}|j}|d&7 }W n ty } ztd'|  d(}W Y d }~nd }~ww |||jd)|f |   d*|d+W W |  S  ty) } z|   |d }~ww |  w ),NTr3   z%Y-%m-%dzw
        INSERT INTO daily_counseling (session_id, sender, message, created_at)
        VALUES (%s, %s, %s, NOW())
    userz(SELECT id FROM daily_plans WHERE id = %sz>SELECT id FROM daily_plans WHERE session_id = %s AND date = %su   データなしzmSELECT title, current_count, original_target_count, adjusted_target_count, unit FROM goals WHERE plan_id = %srb   r5   r   r6   r[   : r   r<   r=   z, u   現在の午前の成果: []u   
            SELECT sender, message 
            FROM daily_counseling 
            WHERE session_id = %s 
              AND DATE(created_at) = %s  -- [중요] 오늘 생성된 대화만 가져옴
            ORDER BY created_at ASC
        r`   senderUserAIrD   
z#Google API Key is missing in configu   
            あなたは営業社員のメンタルケアとコーチングを行う専門AIです。
            
            # ユーザー情報
            - 現在の時刻: 午後1時 (午前業務終了後)
            - 本日の成果データ: u   
            (形式: 目標項目: 現在/目標)

            # 行動指針
            1. **コンディション確認 (最優先)**:
               - ユーザーの発言から「頭痛」「腹痛」「体調が悪い」「集中できない」などの**不調**が読み取れる場合は、成果の良し悪しに関わらず、まず体を気遣ってください。
               - その上で、**「体調が優れないようですね。午後の目標数値を少し下げましょうか？」** と必ず提案してください。
               
               **[重要: 提案に対する反応への対応]**
               - **A. ユーザーが「下げてほしい」「はい」と同意した場合**:
                 「分かりました。午後の目標数値を調整します。」とだけ答えてください。これ以外の余計な慰めやアドバイスは一切不要です。
                 
               - **B. ユーザーが「いいえ」「そのままやる」と断った場合**:
                 不調をおして頑張ろうとするその姿勢を**強く称賛**し、「無理は禁物ですが、その意気込みならきっとできます！」と全力で応援してください。

            2. **共感**: (体調に問題がない場合) まずユーザーの感情に寄り添ってください。否定せず受け入れてください。
            3. **分析**: 成果データを見て、客観的な事実に基づいたアドバイスをしてください。
               - 進捗が良い場合(50%以上): 褒めて、午後の勢いをつける言葉を。
               - 進捗が悪い場合(50%未満): 責めずに、「午後は量より質でいこう」などの切り替えの提案を。
            4. **提案**: 抽象的な精神論ではなく、具体的な行動(Action)を1つ提案してください。
               (例: "まずは得意な顧客から電話してみましょう", "5分だけコーヒーブレイクを取りましょう")
            5. **口調**: 丁寧ですが、親しみやすい先輩のような口調で。(〜ですね、〜しましょう)
            6. **長さ**: 3文以内で簡潔に。長すぎると読まれません。
            gemini-2.5-flashu1   Contextを踏まえて、私の最新の発言「u!   」に返答してください。g?system_instructiontemperaturemodelcontentsconfigu_   

これ以上相談したいことがなければ、下のボタンを押してください。zGemini API Error: uB   通信エラーが発生しました。申し訳ありません。botr@   )rA   reply)r!   r   nowstrftimer#   r)   rD   r$   ro   rF   rp   rq   joinr   rG   modelsgenerate_contentr   GenerateContentConfigtextr&   r%   r(   rK   )rL   rW   r!   	today_strr   planplan_sqlcontext_msgr*   	goal_listr.   r]   goal_statushistory_sqlhistory_rowschat_history_textrowroleai_response_textsystem_promptresponseai_errorr0   r   r   r   process_counseling_message  s   ,

	
r   c                 C   s  | j dd}zz|d|jf | }d}|||jf | }d}|||jf | }d}|r?ddd	 |D }nd
}d}	d}
d}|D ]1}t|d }t|d }|
|7 }
||7 }|	d|d  d| d| |d  d|d pud d
7 }	qI|
dkrt||
 d nd}td u rt	dd| d| d|	 d}tj
jddtj|dd d!}|j}d"||d#W W |  S  ty } ztd$|  d%d&dd#W  Y d }~W |  S d }~ww |  w )'NTr3   rX   z
            SELECT g.title, g.original_target_count, g.current_count, g.unit, r.reflection_text
            FROM goals g
            LEFT JOIN sales_report_reflections r ON g.id = r.goal_id
            WHERE g.plan_id = %s
        z
            SELECT message, sender 
            FROM daily_counseling 
            WHERE session_id = %s 
              AND DATE(created_at) = CURDATE()
            ORDER BY created_at ASC
        r`   r   c                 S   s$   g | ]}d |d  d|d  qS )- r   r   rD   r   ).0logr   r   r   
<listcomp>j  s   $ z,generate_final_ai_review.<locals>.<listcomp>u#   特になし (Consultation skipped)r   r6   r   r   r[   r   r<   r=   z (Reflection: r~   u   なしz)
rZ   zGemini Client Not ConfigureduI  
        あなたは営業チームの優秀なマネージャーAIです。
        部下が提出した「本日の営業日報」と、午前中に交わした「相談内容」を総合的に分析し、一日の総括コメントを作成してください。
        
        # 📊 データ
        1. 全体達成率: u9   %
        2. 午前中の相談内容 (Context):
        u@   
        
        3. 詳細レポート (振り返り):
        u  
        
        # 📝 指示
        1. **ストーリーの接続**: もし午前中に悩み(相談)があったなら、その悩みが午後どうなったか（克服したか、まだ続いているか）に触れてください。
        2. **労いと称賛**: 結果だけでなく、過程やメンタルの変化を褒めてください。
        3. **分析**: ユーザーが書いた「振り返り」と「実績」を照らし合わせてフィードバックしてください。
        4. **次へのアクション**: 明日に向けた簡潔なアドバイスを1つ。
        5. **トーン**: 温かく、信頼できるパートナーとして。
        r   uH   本日の日報に対するフィードバックをお願いします。gffffff?r   r   r@   )rA   
ai_comment
total_ratezError generating review: r   u   AI分析中にエラーが発生しました。しかし、今日の一日は確実にあなたの力になっています。お疲れ様でした。)r!   r#   ro   rp   r)   r   r"   r8   r   rG   r   r   r   r   r   r(   r&   r%   )rL   rW   r!   r*   r   detailscounsel_sqlcounsel_logscounseling_contextreport_summaryr   r   dr]   r/   r   r   r   r   r0   r   r   r   generate_final_ai_reviewJ  sr   8
	


	r   c              
   C   sv   | j dd}z/zd}|||j|j|jf |   ddiW W |  S  ty5 } z|   |d }~ww |  w )NTr3   z
            UPDATE daily_plans 
            SET final_user_comment = %s, final_ai_comment = %s
            WHERE id = %s
        rD   uT   日報が完全に保存されました。本日も本当にお疲れ様でした！)	r!   r#   final_user_commentfinal_ai_commentro   r$   r(   r&   rK   r   r   r   r   save_final_review  s   


r   r)   c                 C   sx  | j dd}zzd}|||f | }g }|D ]}d}|||d f | }g }	|D ]@}
t|
d }t|
d }|dkrHt|| d	 nd}|	|
d
 | rWt|n|| r`t|n||
d ||
d pjdd q.d}||||d f | }||d t|d |d |d |d |d |d |	|d	 qd|iW W |  S  t	y } z|d }~ww |  w )NTr3   z
            SELECT id, date, total_status, boss_comment, final_ai_comment, final_user_comment, morning_motivation
            FROM daily_plans 
            WHERE session_id = %s 
            ORDER BY date DESC LIMIT 30
        a%  
                SELECT 
                    g.title, g.original_target_count, g.current_count, g.unit,
                    r.reflection_text
                FROM goals g
                LEFT JOIN sales_report_reflections r ON g.id = r.goal_id
                WHERE g.plan_id = %s
            rb   r6   r   r   rZ   r[   r=   r~   r`   )r[   r]   r/   r=   r^   
reflectionz
                SELECT sender, message, DATE_FORMAT(created_at, '%H:%i') as time
                FROM daily_counseling 
                WHERE session_id = %s AND DATE(created_at) = %s
                ORDER BY created_at ASC
            r   total_statusr   r   r   morning_motivation)	ro   r   rA   r   r   r   mindsetr   counseling_logsdata)
r!   r#   rp   r"   r8   rq   r7   r'   r(   r&   )rL   r)   r!   r   plansresultsp
detail_sqlr   formatted_detailsr   origcurrr^   r   r   r0   r   r   r   get_boss_daily_reports  sX   	







r   c              
   C   s  | j dd}zwz]d}|||jf | }|s#dddW W |  S ddd	 |D }td u r5td
d}tjj	dd| t
j|ddd}|j}d}	||	||jf |   d|dW W |  S  ty} }
 z|   td|
  |
d }
~
ww |  w )NTr3   z
            SELECT sender, message 
            FROM daily_counseling 
            WHERE session_id = %s AND DATE(created_at) = CURDATE()
            ORDER BY created_at ASC
        skippedzNo counseling logs found.r   r   c                 S   s"   g | ]}|d   d|d  qS )r   r   rD   r   )r   lr   r   r   r     s   " z0summarize_morning_counseling.<locals>.<listcomp>zGoogle API Key is missingu  
        あなたは営業マネージャーのアシスタントAIです。
        午前業務終了後の「部下との相談チャットログ」を分析し、
        部下の「現在のモチベーション状態」や「抱えている悩み」を
        日本語で 1〜2文の簡潔な要約文 にまとめてください。
        
        この要約はデータベースの 'morning_motivation' カラムに保存され、
        上司が部下の状態を把握するために使われます。
        
        出力例:
        - 電話が繋がらず落ち込んでいたが、午後はアプローチを変えて頑張るとのこと。
        - 目標を上回るペースで進んでおり、意欲は非常に高い。
        - 疲れが見えるため、午後のこまめな休憩を提案した。
        - コンディションが悪そうなので、午後の目標数を減らすことを提案した。
        r   zChat Logs:
g      ?r   r   z<UPDATE daily_plans SET morning_motivation = %s WHERE id = %sr@   )rA   summaryzError summarizing counseling: )r!   r#   r)   rp   r(   r   r   rG   r   r   r   r   r   ro   r$   r&   rK   r%   )rL   rW   r!   r   logscontext_textr   r   r   r-   r0   r   r   r   summarize_morning_counseling  sB   
1	

r   c              
   C   sD  d}d}dddddddd	d
d	}zzWt  }|jdd}d}||| f | }i }|rT|D ]}t|d }|||}	|d ||	< q.|W W |rL|  |rS|  S S ddddW W |ra|  |rh|  S S  ty }
 ztd|
  ddiW  Y d}
~
W |r|  |r|  S S d}
~
ww |r|  |r|  w w )u   
    Sales_C_DB의 T_daily 테이블에서 팀의 목표 달성률을 조회하고,
    숫자로 된 카테고리 ID를 실제 항목명으로 변환하여 반환합니다.
    N   リストアップ	   架電数   繋がるための行動u   アポu   訪問u   見積u	   見積額u   受注u	   受注額)	123456789Tr3   zt
            SELECT category, achievement_rate 
            FROM T_daily 
            WHERE session_id = %s
        r    achievement_rateK   )r   r   r   z-Error fetching team goal rates from T_daily: u	   各項目u   設定された基準)	r   r!   r#   rp   r'   getr(   r&   r%   )r)   r,   r!   CATEGORY_MAPr   ratesresultrcat_keycat_namer0   r   r   r   get_team_goal_ratesO  sV   r   )(mysql.connectorr   osgoogle.genair   r   app.corer   app.core.configr   r   app.schemas.today_goal_schemar   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r1   rV   r|   r   r   r   r   r   r   r   r'   r   r   r   r   r   r   r   <module>   s2    0/,GtQ hHB