o
    >5ie                     @   s   U d Z ddl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 e  G dd	 d	Zdaee ed
< defddZdS )z.Google Gemini AI Client for Financial Analysis    N)Optional)retrystop_after_attempt
wait_fixed)load_dotenv   )FinancialReportc                   @   s   e Zd ZdZddedefddZeededd	d
edefddZ	de
defddZde
defddZde
defddZde
defddZde
defddZde
defddZdS )GeminiClientz2Gemini AI Client for generating financial insightsNapi_key
model_namec                 C   sP   |pt d| _|pt dd| _| jstdtj| jd t| j| _d S )NZGOOGLE_API_KEYZGEMINI_MODELzgemini-2.0-flashz.GOOGLE_API_KEY not found. Set it in .env file.)r
   )	osgetenvr
   r   
ValueErrorgenaiZ	configureZGenerativeModelmodel)selfr
   r    r   U/var/www/tkim.planitai.co.jp/gemegg/20251207-make-pdf-report/project/src/ai_client.py__init__   s   zGeminiClient.__init__      )stopwaitpromptreturnc                 C   s   | j |}|j S )z!Generate content using Gemini API)r   generate_contenttextstrip)r   r   responser   r   r   r      s   
zGeminiClient.generate_contentreportc                 C   sP   |  |}| |}d|j d|j d|j d|j d| d| d}| |S )z'Generate AI summary of financial reportu   あなたは経験豊富な財務アナリストです。以下の財務データを分析し、経営者向けの簡潔なサマリを日本語で作成してください。

## 会社情報
- 会社名: u   
- 会計年度: u   
- 対象期間: u   
- 対象月: u   

## KPI実績
u   

## 損益計算書サマリ
u>  

## 要求事項
1. 3〜5個の箇条書きで主要なポイントを要約
2. 良い点と改善点をバランスよく記載
3. 具体的な数値を含める
4. 経営判断に役立つ洞察を提供
5. 100〜200文字程度で簡潔に

## 出力形式
HTMLの<ul><li>タグ形式で出力してください。)_build_kpi_context_build_pl_contextcompany_namefiscal_yearperiodtarget_monthr   )r   r   Zkpi_summaryZ
pl_summaryr   r   r   r   generate_financial_summary"   s    

	
z'GeminiClient.generate_financial_summaryc                 C   s    |  |}d| d}| |S )z2Generate AI analysis of budget vs actual variancesu   あなたは財務アナリストです。以下の予算と実績の差異データを分析してください。

## 差異データ
u  

## 分析要求
1. 最も大きな差異がある項目を特定
2. 差異の原因を推測
3. 改善のための提案を含める
4. 日本語で3〜4つの箇条書きで回答

## 出力形式
HTMLの<ul><li>タグ形式で出力してください。)_build_variance_contextr   )r   r   Zvariance_datar   r   r   r   generate_variance_analysisB   s
   

z'GeminiClient.generate_variance_analysisc              
   C   s   |  |}d| d}| |}ddl}z |d}|dd }|dkr3||kr3|||| W S W n
 |jy>   Y nw dd	d
dddddddddddd
ddd
dddddS )z0Generate financial highlight scores and analysisu   あなたは財務アナリストです。以下の財務データを6つの観点で評価してください。

## 財務データ
u-  

## 評価項目（各5点満点）
1. 売上持続性（売上高増加率）
2. 収益性（営業利益率）
3. 生産性（労働生産性）
4. 健全性（財務健全性）
5. 効率性（資本効率）
6. 安全性（自己資本比率）

## 出力形式
以下のJSON形式で出力してください：
{
  "total_score": 数値,
  "grade": "A/B/C/D/E",
  "scores": {
    "売上持続性": {"score": 数値, "comment": "コメント"},
    "収益性": {"score": 数値, "comment": "コメント"},
    "生産性": {"score": 数値, "comment": "コメント"},
    "健全性": {"score": 数値, "comment": "コメント"},
    "効率性": {"score": 数値, "comment": "コメント"},
    "安全性": {"score": 数値, "comment": "コメント"}
  },
  "overall_comment": "総合コメント"
}r   N{}r      Br   u   データ不足)scorecomment   u   良好u   改善余地ありu   普通)u   売上持続性u	   収益性u	   生産性u	   健全性u	   効率性u	   安全性u*   全体的に良好な財務状況です。)total_scoregradescoresoverall_comment)r    r   jsonfindrfindloadsJSONDecodeError)r   r   Zkpi_datar   r   r4   Z
json_startZjson_endr   r   r   generate_financial_highlightsV   s4   


z*GeminiClient.generate_financial_highlightsc                 C   sZ   g }|j D ]}|jrd|jddnd}|d|j d|j |  q|r+d|S dS )	z$Build KPI context string for promptsu
    (目標: ,.0f) - z: 
u   KPIデータなし)annual_kpistarget_valueappendtitleformatted_valuejoin)r   r   lineskpiZ
target_strr   r   r   r       s
   
 zGeminiClient._build_kpi_contextc              
      s   g }g d}|j D ]B t fdd|D rK jdkrK jr# jdnd} jd} j}|dkr7d|dn|d}|d j d	| d
| d q	|rSd|S dS )z$Build P/L context string for prompts)u	   売上高u   売上原価u	   売上総u   営業u   経常u	   純利益c                 3   s    | ]}| j v V  qd S )N)name).0keyitemr   r   	<genexpr>   s    z1GeminiClient._build_pl_context.<locals>.<genexpr>r   r:   -+r=   u	   : 実績 u   円 (予算比 u   円)r>   u   P/Lデータなし)	pl_itemsanyleveltotal_budgettotal_actualtotal_variancerA   rG   rD   )r   r   rE   	key_itemsbudgetactualvarianceZvar_strr   rJ   r   r!      s   
 
 zGeminiClient._build_pl_contextc                 C   s   g }|j dd D ]4}|jr=|jdkr=|j}|t|j d }t|dkr=|d|j d|jdd	|jdd
|dd	 q	|rEd|S dS )z)Build variance context string for promptsN   r   d   
   r=   u	   : 予算 r:   u   円 → 実績 u   円 (差異 z+.1fz%)r>   u   有意な差異なし)rO   rR   rT   absrA   rG   rS   rD   )r   r   rE   rK   rX   rater   r   r   r'      s   z$GeminiClient._build_variance_context)NN)__name__
__module____qualname____doc__strr   r   r   r   r   r   r&   r(   dictr9   r    r!   r'   r   r   r   r   r	      s    
 =r	   _gemini_clientr   c                   C   s   t du rt a t S )z%Get or create Gemini client singletonN)rd   r	   r   r   r   r   get_gemini_client   s   re   )ra   r   typingr   Ztenacityr   r   r   Zgoogle.generativeaiZgenerativeair   dotenvr   data_modelsr   r	   rd   __annotations__re   r   r   r   r   <module>   s     .