o
    >i$                     @   sl   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d Z
dd	 Zd
d Zdd Zdd ZdS )    N)get_gemini_model)genai)types)get_usernamec                 C   s`   |dkrdS | | d }|dkrd}| |fS |dkr d}| |fS |dkr*d	}| |fS 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grader   r   :/home/air/goalskill_sales/back/app/services/spi_scoring.pycalculate_ability_grade
   s   r   c                 C   s  dddddd}g g g g g d}| D ])}| d}| d	d
}|s"qt| d  }|r;||v r;|| ||  qi }d}| D ]6\}}	|	rst|	t|	 }
|t|	7 }|
dkr_d}n	|
dkrfd}nd}t|
d|d||< qDddd||< qD||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%   r   r   r   calculate_personality_scores(   s6   

r9   c                 C   s   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summaryr   r   r   generate_spi_summaryZ   s   r>   c              
   C   s.  ddl }|j  d}d}d}	t| }
|
r|
n| }zt|||}W n ty= } ztd|  d}W Y d}~nd}~w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_scorer:   nonverbal_scorer;   personality_scoresrA   now_str
thick_line	thin_lineusernamedisplay_name
ai_commentereport_textr   r   r   generate_professional_reportv   s^   
	
rT   c              
   C   s  g }dddddd}zst  }g }| D ]$\}}|| v r8| | dd}	|d	| d
|	  |	dkr8|| qd|}
t|dk}|dkpK|dk}d| d| d|
 d}|jjdtj	dtj
|dgdgtjddd}|j }|s{td|W S  ty } z>td|  t|dk}|rW Y d}~dS |rt|dkrd|dd n|d  }d!| d"W  Y d}~S W Y d}~d#S d}~ww )$uK   
    SPI 결과 AI 코멘트 생성 (능력치 + 성격 통합 분석)
    u	   積極性u	   協調性u	   責任感u	   計画性u   メンタル)r   r   r   r   r   r%   -z- z: r#   r@   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 AIr?   Nuc   組織適応力が高く、攻守のバランスが非常に優れた「万能型」の人です。r   u   とr   u   高いu3   を持つ、バランスの取れた人材です。u?   検査結果を基に、この人の特徴を分析中です。)r   r,   r'   r+   rG   r.   modelsgenerate_contentr   ContentPartGenerateContentConfigrW   r)   
ValueErrorrE   rF   )rK   r:   r;   high_traitstrait_namesclientpersonality_lineskeynamer%   personality_textis_all_highhas_low_gradepromptresponserQ   rR   	trait_strr   r   r   rD      sX   


%

&rD   )jsonrA   app.core.configr   googler   google.genair   app.models.general_moduler   r   r9   r>   rT   rD   r   r   r   r   <module>   s   27