
    Ui2)                     t    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	 d Z
d Zded	efd
Zd Zd Zd ZdS )    N)get_gemini_model)genai)types)get_usernamec                 d    |dk    rdS | |z  dz  }|dk    rd}n|dk    rd}n|dk    rd	}nd
}| |fS )u   
    능력검사(言語/非言語) 등급 계산
    
    Args:
        correct_count: 정답 수
        total_count: 전체 문제 수
    
    Returns:
        tuple: (score, grade)
        - score: 정답 수
        - grade: A/B/C/D
    r   )r   Dd   P   A<   B(   Cr    )correct_counttotal_count
percentagegrades        /app/app/services/spi_scoring.pycalculate_ability_grader   
   si     av+-4JR	r			r		%    c                 ^   dddddd}g g g g g d}| D ]}|                     d          }|                     d	d
          }|s0t          |                                          d                                         }|r%||v r!||                             ||                    i }d}|                                D ]k\  }}	|	r\t          |	          t          |	          z  }
|t          |	          z  }|
dk    rd}n|
dk    rd}nd}t          |
d          |d||<   cddd||<   l||d<   |S )u   
    성격검사 점수 계산 (입력값 유연화 적용)
    - "A"만 오거나 "A 当てはまる"가 와도 모두 처리 가능
                   )r   r   r   r   E
positivitycooperation
resilienceresponsibilityplanningtraitselected_option r   g      @   高g      @u   中u   低)scorelevelu   測定不能total_score)	getstrstripupperappenditemssumlenround)answers	score_maptrait_scoresanswerr%   selected
first_charresultr+   scores	avg_scorer*   s               r   calculate_personality_scoresr>   (   s    QQQQ I
 2" L
  > >

7##::/44 	 ]]((**1-3355
 	>Z9,,&&y'<===FK%++-- B Bv 	BFc&kk1I3v;;&KCc!!555%&+Iq&9&9EJJF5MM '(.AAF5MM'F=Mr   personality_scoresreturnc                 l    dddddd}i }|                                 D ]\  }}|| v r| |         ||<   |S )u  
    性格検査の結果を日本語キーに変換してDB保存用に整形する。
    グラフ作成者がそのまま使える形式に変換。

    Args:
        personality_scores: calculate_personality_scores()の戻り値

    Returns:
        {
            "積極性": {"score": 4.0, "level": "高"},
            "協調性": {"score": 3.5, "level": "中"},
            ...
        }
    	   積極性	   協調性   メンタル	   責任感	   計画性r   )r1   )r?   trait_name_mapr;   keyjp_names        r   format_personality_for_dbrJ   Z   se      ""$% N F&,,.. 6 6W$$$05F7OMr   c                     d|  d| d| d}|S )u   
    SPI 결과 요약 메시지 생성
    
    Args:
        language_grade: 言語 등급 (A/B/C/D)
        nonverbal_grade: 非言語 등급 (A/B/C/D)
        personality_type: 性格 유형
    
    Returns:
        str: 요약 메시지
    u6   【SPI検査結果】

▼ 能力検査
言語能力: u   
非言語能力: u   

▼ 性格検査
u   

お疲れ様でした！r   )language_gradenonverbal_gradepersonality_typesummarys       r   generate_spi_summaryrP   w   sB    	 	 	 "		 	 	 	 	G Nr   c                    ddl }|j                                                             d          }d}d}	t          |           }
|
r|
n| }	 t	          |||          }n+# t
          $ r}t          d|            d}Y d}~nd}~ww xY wd                    g d	| d
| d| d| d|	 d|	 d| d| d|	 d|	 d| d| d|	 d|	 d	| d	| d	          }|S )uY   
    SPI 리포트 생성 (성격 부분은 리스트 없이 코멘트로만 대체)
    r   Nz%Y-%m-%d %H:%Mui   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ui   ───────────────────────────────────[SPI AI Comment Error] u   データを分析中です...r'   
u    
 SPI3 総合診断レポート
z
Name : z
Date : z

u   
【1】 言語 (Language)
u   
  ■ スコア : u    / 5
  ■ ランク : u    
【2】 非言語 (Non-verbal)
u   
【3】 性格・総評
)datetimenowstrftimer   generate_ai_comment	Exceptionprintjoin)
session_idlanguage_scorerL   nonverbal_scorerM   r?   rT   now_str
thick_line	thin_lineusernamedisplay_name
ai_commentereport_texts                  r   generate_professional_reportrf      su    OOO##%%../?@@GJI J''H'788ZL6();^_]]

 6 6 6+++,,,5





6
             		   
 	            "    "             #!   " ##   & '   * +   , -   . /     K4 s   A 
B'B  Bc           	         g }dddddd}	 t                      }g }|                                D ][\  }}|| v rR| |                             dd          }	|                    d	| d
|	            |	dk    r|                    |           \d                    |          }
t          |          dk    }|dk    p|dk    }d| d| d|
 d}|j                            dt          j	        dt          j
        |          g          gt          j        d                    }|j                                        }|st          d          |S # t          $ r}}t!          d|            t          |          dk    }|rY d}~dS |rCt          |          dk    rd                    |dd                   n|d          }d!| d"cY d}~S Y d}~d#S d}~ww xY w)$uK   
    SPI 결과 AI 코멘트 생성 (능력치 + 성격 통합 분석)
    rB   rC   rE   rF   rD   )r    r!   r#   r$   r"   r*   -z- z: r(   rS   r   r   u   
あなたは企業の人事担当者です。
以下のSPI検査結果に基づき、**この人はどんな人か**を分析してください。

【検査結果】
[能力検査]
- 言語能力ランク: u   
- 非言語能力ランク: u   

[性格検査]
u  

【作成の指針】
1. **分析の視点**: 「この人はどんな人か」を客観적으로分析してください。
   - 個人の「好み」ではなく、仕事における「実務遂行能力」「組織適応力」「ストレス耐性」に焦点を当ててください。
   - 「この人は〜な人です」「〜なタイプです」という形式で記述してください。

2. **能力と性格の統合**: 
   - 能力ランクが高い場合: その知能と性格面の組み合わせで、どんな特徴があるかを分析してください。
   - **能力ランクが低い(C, D)場合**: 能力の結果には直接触れず、性格面の特徴を中心に「この人はどんな人か」を分析してください。
   
3. **All High（全項目が高い）の場合の対応**:
   - 絶対に「非現実的」「矛盾している」などの表現は避けてください。
   - 「組織適応力が高く、攻守のバランスが優れた万能型の人」「プレッシャーに強い強靭なメンタルの持ち主」として**客観的に分析**してください。

【制約事項】
- 言語: 自然な日本語
- 長さ: 100文字以内（簡潔に）
- 形式: 「この人は〜な人です」「〜なタイプです」「〜持ち主です」など、**「この人はどんな人か」を説明する形式**
- トーン: **客観的でプロフェッショナルな分析**（応援や励ましの言葉は使わない）
- 終わり方: 「〜人です」「〜タイプです」「〜持ち主です」など、**客観的な分析で終わる**（「自信を持ってください」「頑張ってください」などの応援メッセージは絶対に使わない）
- **結果が低くても、絶対に否定的な言葉（向いていない、ダメだ等）は使わないこと**

この人はどんな人か、分析してください:
zgemini-2.5-flashuser)text)rolepartsg?)temperature)modelcontentsconfigzEmpty response from AIrR   Nuc   組織適応力が高く、攻守のバランスが非常に優れた「万能型」の人です。r   u   とr   u   高いu3   を持つ、バランスの取れた人材です。u?   検査結果を基に、この人の特徴を分析中です。)r   r1   r,   r0   rZ   r3   modelsgenerate_contentr   ContentPartGenerateContentConfigrj   r.   
ValueErrorrX   rY   )r?   rL   rM   high_traitstrait_namesclientpersonality_linesrH   namer*   personality_textis_all_highhas_low_gradepromptresponserc   rd   	trait_strs                     r   rW   rW      s   
 K!+Q\~ K
RY!## $**,, 	- 	-IC(((*3/33GSAA!(()=d)=)=e)=)=>>>E>>&&t,,,99%677;''1, (3.H/S2H" )" " -" " " " "J =11$m
8O8O8O7PQQQR.3??? 2 
 
 ]((**
 	75666 Y Y Y+++,,,;''1, 	Yxxxxxx  Y;>{;K;Kq;P;PEJJ{2A2777VabcVd	^	^^^^^^^^^XXXXXXYs$   EE 
G'G?GGG)jsonrT   app.core.configr   googler   google.genair   app.models.general_moduler   r   r>   dictrJ   rP   rf   rW   r   r   r   <module>r      s      , , , , , ,             2 2 2 2 2 2     </ / /d$ 4    :  84 4 4n]Y ]Y ]Y ]Y ]Yr   